天天看点

又出现了hs_err_xx.log,是时候启用dump文件了

又出现了hs_err_xx.log,是时候启用dump文件了

测试环境也出现了hs_err log,根据头部信息,就是我们常见的OOM。本来想分析一下segmentation文件,但是没有开启,Failed to write core dump,灰常尴尬。要知道很多时候这些问题可能是无法重现的,因此启用core file很重要。

那么咱们来启用这些重要的配置:

1 启用core files

一旦Java崩溃,操作系统将保存一个core file到硬盘,这个core file包括内存的完整dump。在linux下,core files默认是禁用的。在linux启用需要执行ulimit -c unlimited。如下图(修改前):

又出现了hs_err_xx.log,是时候启用dump文件了

修改后:

又出现了hs_err_xx.log,是时候启用dump文件了

注意:core file会占用大量的磁盘空间,Java heap越大,该文件越大。

2 添加-XX:+HeapDumpOnOutOfMemoryError到JVM参数中

添加这个参数后,当Java应用在遇到OutOfMemoryError后,就会将Java Heap dump到硬盘。可以使用jhat来诊断Java Heap,找出哪些对象占用了大部分的空间,然后检查该对象是否未使用,但是却没有被回收。当然,使用mat分析也可以。

注意:head dump文件也非常大。

例如:在IDEA中添加该JVM 参数

又出现了hs_err_xx.log,是时候启用dump文件了

3 添加-verbosegc到JVM命令行

-verbosegc将会打印Java GC的基本信息。这些日志可以帮助我们判断:

• GC是不是运行时间过长?

• 被回收的内存是不是越来越少
           

例如:在IDEA中添加该JVM参数

又出现了hs_err_xx.log,是时候启用dump文件了

启动后如果有GC,则会打印类似如下内容:

又出现了hs_err_xx.log,是时候启用dump文件了

4 打印Java版本和JVM标志

执行以下java -version或者加入-XX:+PrintCommandLineFlags(官方文档这里少了一个:号)和-showversion到JVM参数中。

这些信息可以帮助我们在社区中查找已经报告的问题或者Java的BUG。

例如:在IDEA中添加该参数,得到类似如下打印:

又出现了hs_err_xx.log,是时候启用dump文件了

5 使用JMC JMX进行远程监控

6 最后一个是使用JFR商业特性,在开发阶段使用JFR时免费的。