hs_err_pid.log日志,有趣的两个Jvm参数

遇到一个很有意思的问题,Jvm进程因系统资源不足时会被操作系统kill掉,当守护进程重新拉起该进程时,会产生一个日志文件:hs_err_pid.log,默认情况下这个日志会被生成到工作目录下。今天为了修改这个默认路径,复现了一下Jvm进程OOM后Crash的情况。

那么OOM究竟会不会导致Jvm进程被Crash掉呢?今天上网查了下资料和自己测试了下,结果是oom不会导致Jvm进程被Crash,而是oom只会导致当前线程被回收掉。

如何复现这个问题呢?有意思的是,发现了一个很有意思的Jvm参数 -XX:+CrashOnOutOfMemoryError,这个参数的大概意思是:当发生内存溢出的时,JVM就会退出,同时,JVM会产生文本和二进制格式的崩溃日志。

进程Crash解决了,那如何产生oom呢,我这里修改kafka Broker端的内存,降低堆内存,使kafka服务启动时Jvm内存产生oom错误。


oom有了,如何修改hs_err_pid.log的默认路径呢?有意思的是,又发现了第二个有趣的Jvm参数:-XX:ErrorFile=~/log/hs_err_pid_%p.log,%p的作用是获取当前进程的pid。

上面两个Jvm参数添加如下图示:

是不是现在启动Kafka进程,等着oom,然后生成hs_err_pid.log就行了呢?

NO!

这里java虚拟机又给我反馈了个问题,它不识别-XX:+CrashOnOutOfMemoryError参数,它竟然跟我说它不认识它!!!

 

 

好吧,我大声告诉你,jdk在1.8.0_92版本修复了这个问题,所以升级你的jdk到这个版本之上吧。

万事大吉,只欠启动,完事。

本文介绍的两个参数算是比较冷门的Jvm参数了,所以,有机会能遇到,觉得还是很有意思的。

欢迎关注我的微信公众号《小沈干货》获取更多学习内容。

 

posted @ 2020-05-03 22:13  OliverShen  阅读(3337)  评论(0编辑  收藏  举报