触发JVM fatal error并配置相关JVM参数
1. 絮絮叨叨
-
工作中,Java服务因为
fatal error(致命错误,笔者称其为jvm crash),在服务运行日志中出现了致命错误的概要信息:# # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x000000010a7d52e8, pid=47989, tid=11011 # # JRE version: OpenJDK Runtime Environment Temurin-17.0.6+10 (17.0.6+10) (build 17.0.6+10) # Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (17.0.6+10, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-amd64) # Problematic frame: # V [libjvm.dylib+0xada2e8] Unsafe_GetByte(JNIEnv_*, _jobject*, _jobject*, long)+0xd8 # # No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # # An error report file with more information is saved as: # /Users/xxx/IdeaProjects/study/hs_err_pid47989.log # # If you would like to submit a bug report, please visit: # https://github.com/adoptium/adoptium-support/issues # -
服务运行在k8s中,由于未提前设置fatal error日志的路径(挂载到宿主机目录),容器重启后该日志会丢失,无法深入排查原因
-
因此,需要查询jvm的配置,将fatal error日志写入指定目录,保证该日志持久化存储到宿主机磁盘
2. 配置jvm参数,实现日志的持久化存储
2.1 -XX:ErrorFile配置fatal error路径
-
通过查阅资料,了解到可以通过
-XX:ErrorFile=filename配置hs_err日志的路径 -
下面的示例中,将fatal error的日志写入指定目录,文件名的
%p会动态替换成改Java程序的PID(进程id)-XX:ErrorFile=/var/log/java/java_error%p.log -
默认将fatal error日志写入Java程序的working directory,且文件名为
hs_err_pid.log;如果空间不足、权限不够等原因,fatal error日志将被写入系统的临时目录 -
详情见JDK官网的说明:
- JDK 8:A Fatal Error Log
- JDK 17:A Fatal Error Log,Command-Line Options
2.2 笔者的错误配置
-
考虑到服务每次重启的pid基本一致,如果多次出现fatal error,只使用pid的日志会被覆盖。
-
笔者结合之前配置heap dump的经验,添加了
%t以生成类似2023-08-16_23-33-08的时间戳-XX:ErrorFile=/data_path/var/log/hs_err_pid%p_%t.log -
当再一次发生fatal error时,发现日志文件名为
hs_err_pid6_%t.log,即%t未按照预期进行解析
2.3 -XX:OnError配置更新文件名
-
受问题(How to specify a unique name for the JVM crash log files?)启发,配置
-XX:OnError:在日志生成后,执行shell命令为其添加时间戳-XX:ErrorFile=/data_path/var/log/hs_err.log -XX:OnError="time=`date +%Y%m%d_%H%M%S` && mv /data_path/var/log/hs_err.log /data_path/var/log/hs_err_\${time}.log"
3. 如何触发fatal error?
-
不管是验证相关JVM参数的配置,还是学习查看fatal error日志的内容,学会如何在触发fatal error是非常必要的
-
参考:Write Java code to crash the java virtual machine,通过如下代码可以成功在本地触发fatal error
import sun.misc.Unsafe; import java.lang.reflect.Field;public class CrashTest {public static void main(String... args) throws Exception {getUnsafe().getByte(0);}private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);return (Unsafe) theUnsafe.get(null);} }
4. 待交流的问题
4.1 本地验证OK
-
按照上面的描述,笔者为
CrashTest配置了如下JVM参数-XX:ErrorFile=/data_path/study/hs_err.log -XX:OnError="time=`date +%Y%m%d_%H%M%S` && echo $time && mv /data_path/hs_err.log /data_path//hs_err_${time}.log" -
程序运行起来后,打印如下信息:
# # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x000000010a49e2e8, pid=56245, tid=11011 # # JRE version: OpenJDK Runtime Environment Temurin-17.0.6+10 (17.0.6+10) (build 17.0.6+10) # Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (17.0.6+10, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-amd64) # Problematic frame: # V [libjvm.dylib+0xada2e8] Unsafe_GetByte(JNIEnv_*, _jobject*, _jobject*, long)+0xd8 # # No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # # An error report file with more information is saved as: # /data_path/hs_err.log # # If you would like to submit a bug report, please visit: # https://github.com/adoptium/adoptium-support/issues # # # -XX:OnError="time=`date +%Y%m%d_%H%M%S` && mv /data_path/hs_err.log /data_path/hs_err_${time}.log" # Executing /bin/sh -c "time=`date +%Y%m%d_%H%M%S` && mv /data_path/hs_err.log /data_path/hs_err_${time}.log" ... -
最终,fatal error日志的文件名为
hs_err_20230827_202458.log,符合预期!
4.2 测试环境验证失败
-
将此配置移动到线上服务,却发现fatal error日志的文件名为
hs_err_.log不符合预期 -
怀疑:未能正确解析
${time} -
一个问答: How to add the timestamp of the fatal error occurrence to Java fatal error log filename,遇到了与笔者类似的问题
-XX:ErrorFile={{ .Values.server.data_dir }}/var/log/hs_err.log -XX:OnError="mv {{ .Values.server.data_dir }}/var/log/hs_err.log {{ .Values.server.data_dir }}/var/log/hs_err_\$(date +%Y%m%d_%H%M%S).log" -
虽然更新了配置,但是由于引发fatal error的错误已被修复,无法验证该配置的效果
-
要么等到后面出现fatal error时验证效果,要么回退镜像版本触发fatal error
-
若后续有机会验证该配置,笔者会更新结果,暂时在此记录可能的可行解决方案
相关文章:
触发JVM fatal error并配置相关JVM参数
1. 絮絮叨叨 工作中,Java服务因为fatal error(致命错误,笔者称其为jvm crash),在服务运行日志中出现了致命错误的概要信息: # # A fatal error has been detected by the Java Runtime Environment: # # S…...
爬虫(bilibili热门课程记录)
什么是爬虫?程序蜘蛛,沿着互联网获取相关信息,收集目标信息。 一、python环境安装 1、先从Download Python | Python.org中下载最新版本的python解释器 2、再从Download PyCharm: Python IDE for Professional Developers by JetBrains中下…...
14-模型 - 增删改查
增: # 1. 找到模型类并创建对象 user User() # 2. 给对象的属性赋值 user.username username user.password password user.phone phone # 3. 将user对象添加到session中 (类似缓存) db.session.add(user) # 4. 提交数据 db.session.commit() 删: # 两种删除:# 1. 逻辑删…...
C#与西门子PLC1500的ModbusTcp服务器通信3--搭建ModbusTcp服务器
1、打开仿真工具,创建PLC,注意创建完成后不要关闭 注意,这个IP地址必须与西门子虚拟网卡的IP地址及虚拟机的网卡IP地址同一网段 2、打开博途V15,创建项目,命名为Lan项目 3、添加1500系列CPU1513 4、设置设置IP地址及属…...
Linux系统编程:线程控制
目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…...
基于Java+SpringBoot+Vue前后端分离纺织品企业财务管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
搭建开发环境-Windows
写C# 的请出去。 然后,Windows 是最好的Linux发行版。搭建开发环境-WSLUbuntu...
【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法
文章目录 一、集成算法1.1 概念1.2 常用集成算法1.2.1 Bagging1.2.2 Boosting1.2.2.1 AdaBoost1.2.2.2 GBDT1.2.2.3 XgBoost 1.2.3 Stacking 二、聚类算法2.1 概念2.2 常用聚类算法2.2.1 K-means2.2.2 层次聚类2.2.3 DBSCAN算法2.2.4 AP聚类算法2.2.5 高斯混合模型聚类算法 一、…...
SSM商城项目实战:账户充值功能实现
SSM商城项目实战:账户充值功能实现 在一个电商平台中,用户账户充值是一个非常重要的功能。本文将介绍如何在SSM(SpringSpringMVCMyBatis)商城项目中实现账户充值功能。通过本文的指导,你将学会如何在项目中添加账户充…...
wireshark工具pcap文件转换
pcap详解_pcap_loop_小虎随笔的博客-CSDN博客 分析802.11无线报文hexdump内容:利用wireshark自带二进制工具text2pcap将hexdump内容转换为pcap文件..._weixin_30835933的博客-CSDN博客 text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件(wireshark,数据) …...
Python+TinyPNG熊猫网站自动化的压缩图片
前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉…...
【Linux】socket 编程基础
文章目录 📕 网络间的通信📕 socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…...
openGauss学习笔记-51 openGauss 高级特性-列存储
文章目录 openGauss学习笔记-51 openGauss 高级特性-列存储51.1 语法格式51.2 参数说明51.3 示例 openGauss学习笔记-51 openGauss 高级特性-列存储 openGauss支持行列混合存储。行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。 行、列…...
ReactNative 密码生成器实战
效果展示图 使用插件 Formik 负责表单校验、监听表单提交、数据校验错误信息展示 Yup 负责表单校验规则 分析页面 从上述的展示图我们可以看到的主要元素有:输入框、单选按钮和按钮。其中生成的密码长度不可能很大也不可能为负数和 0,所以我们可以限…...
开始MySQL之路——外键关联和多表联合查询详细概述
多表查询和外键关联 实际开发中,一个项目通常需要很多张表才能完成。例如,一个商城项目就需要分类表,商品表,订单表等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表…...
无涯教程-PHP - intval() 函数
PHP 7引入了一个新函数 intdiv(),该函数对其操作数执行整数除法并将该除法返回为int。 <?php$valueintdiv(10,3);var_dump($value);print(" ");print($value); ?> 它产生以下浏览器输出- int(3) 3 PHP - intval() 函数 - 无涯教程网无涯教程网…...
2023年国赛数学建模思路 - 案例:粒子群算法
文章目录 1 什么是粒子群算法?2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法? 粒子群算法(Pa…...
【1++的数据结构】之map与set(一)
👍作者主页:进击的1 🤩 专栏链接:【1的数据结构】 文章目录 一,关联式容器与键值对二,setset的使用 三,mapmap的使用 四,multiset与multimap 一,关联式容器与键值对 像l…...
Ubuntu断电重启后黑屏左上角光标闪烁,分辨率低解决办法,ubuntu系统display只有4:3 怎么办?太卡
这个问题主要是显卡驱动问题,按照步骤更新显卡驱动 1,选择metapackage 并且选择proprietary版本,选择版本号选择最新的版本。 2,具体步骤参考 前言 笔者在安装显卡驱动时并未遇到问题,主要是后续屏幕亮度无法调节&…...
Java 微服务当中POST form 、url、json的区别
在Java微服务的Controller中,你可以处理来自客户端的不同类型的POST请求,包括POST form、POST URL参数和POST JSON数据。以下是它们的区别以及在微服务Controller中的示例说明: POST Form 表单数据: 当客户端以表单方式提交数据…...
如何使用USearch构建自动驾驶传感器数据的实时向量搜索系统
如何使用USearch构建自动驾驶传感器数据的实时向量搜索系统 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & 🔜 Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and Wolfra…...
大模型入门指南:小白程序员必看,收藏学习路径!
一、基础通用概念AI(人工智能) 让机器模拟人类智能(感知、推理、学习、决策)的技术总称。 ML(机器学习) AI 的核心分支:让机器从数据中自动学习规律,不用逐条写规则。 DL(…...
OpenWrt旁路由进阶玩法:用iPhone USB网络共享做冗余WAN口,提升家庭网络可靠性
OpenWrt旁路由进阶玩法:用iPhone USB网络共享构建冗余WAN口 当家庭网络的核心设备——主路由器突然宕机时,智能家居离线、视频会议中断、NAS文件无法访问的连锁反应会让人措手不及。而将iPhone的USB网络共享转化为OpenWrt旁路由的备用WAN口,就…...
从F1 90到62 F1 90:用Wireshark和CANoe‘解剖’一次完整的UDS 0x22数据读取会话
从F190到62F190:用Wireshark和CANoe解剖UDS 0x22数据读取会话 当你第一次在Wireshark中看到22服务请求和62响应报文时,那些十六进制字节可能就像天书一样难以理解。但正是这些看似杂乱的数据流,承载着现代汽车电子系统最核心的诊断信息交换。…...
Easy-Monitor 安全配置完全手册:保护你的监控数据安全
Easy-Monitor 安全配置完全手册:保护你的监控数据安全 【免费下载链接】easy-monitor 企业级 Node.js 应用性能监控与线上故障定位解决方案 项目地址: https://gitcode.com/gh_mirrors/ea/easy-monitor 在当今数字化时代,企业级 Node.js 应用性能…...
终极指南:如何灵活配置flamegraph性能分析参数生成自定义火焰图
终极指南:如何灵活配置flamegraph性能分析参数生成自定义火焰图 【免费下载链接】flamegraph Easy flamegraphs for Rust projects and everything else, without Perl or pipes <3 项目地址: https://gitcode.com/gh_mirrors/fla/flamegraph flamegraph是…...
导师推荐!2026年最值得用的专业AI论文写作工具
2026年AI论文写作工具已从“单点辅助”升级为智能化学术研究系统,核心评价维度涵盖文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规等关键指标。本次测评覆盖6款主流工具,测试场景包括中文与英文论文、全流程与专项功能、免费与付费版本&#x…...
从‘猫狗大战’到医疗影像:LRP(逐层相关性传播)如何帮医生看懂AI的‘诊断思路’?
从‘猫狗大战’到医疗影像:LRP如何成为医生与AI的翻译官 当一位放射科医生第一次看到AI系统标注的肺结节"恶性概率92%"时,他的反应不是赞叹,而是皱眉:"它凭什么这么判断?"这种场景正在全球各大医院…...
头歌平台实战:C语言文件操作中的数字提取与格式化存储
1. 头歌平台C语言文件操作实战入门 第一次接触头歌平台的C语言文件操作任务时,我完全被那些fopen、fscanf函数弄晕了。直到真正动手完成"数字提取与格式化存储"这个项目,才发现原来文件操作可以这么有趣又实用。这个项目特别适合刚学完C语言基…...
TouchGal:一站式Galgame社区解决方案终极指南
TouchGal:一站式Galgame社区解决方案终极指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 还在为寻找Galgame资源而四…...
