测试环境也出现了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。如下图(修改前):
修改后:
注意:core file会占用大量的磁盘空间,Java heap越大,该文件越大。
2 添加-XX:+HeapDumpOnOutOfMemoryError到JVM参数中
添加这个参数后,当Java应用在遇到OutOfMemoryError后,就会将Java Heap dump到硬盘。可以使用jhat来诊断Java Heap,找出哪些对象占用了大部分的空间,然后检查该对象是否未使用,但是却没有被回收。当然,使用mat分析也可以。
注意:head dump文件也非常大。
例如:在IDEA中添加该JVM 参数
3 添加-verbosegc到JVM命令行
-verbosegc将会打印Java GC的基本信息。这些日志可以帮助我们判断:
• GC是不是运行时间过长?
• 被回收的内存是不是越来越少
例如:在IDEA中添加该JVM参数
启动后如果有GC,则会打印类似如下内容:
4 打印Java版本和JVM标志
执行以下java -version或者加入-XX:+PrintCommandLineFlags(官方文档这里少了一个:号)和-showversion到JVM参数中。
这些信息可以帮助我们在社区中查找已经报告的问题或者Java的BUG。
例如:在IDEA中添加该参数,得到类似如下打印:
5 使用JMC JMX进行远程监控
6 最后一个是使用JFR商业特性,在开发阶段使用JFR时免费的。