出现的现象:生成heapdump文件,及javacore文件。且javacore中有明显OutOfMemory字样。有时内存溢出会导致WAS挂了,有时不会挂,会自动恢复。
如果WAS挂了,重启即可,不用额外操作收集信息。
后续分析日志:
下载native_stderr.log文件,在/was7/profiles/AppSrv01/logs/server1下,与SystemOut.log同一目录,利用ga452.jar工具打开该文件,选择Used Tenured,
1、如果出现以下情况,表明是由于长期的内存泄漏导致的,可以通过查看SystemErr.log相关报错信息,先解决这些报错信息,再进行观察。
2、如果出现下面的图形表明是由于某个时刻某个线程异常申请内存空间导致的,需要查当前时间点的SystemOut.log日志。也需要结合当前时间点的SystemErr.log日志,整体分析当前时间点应用正在执行的操作。
查看生成的javacore文件。找到当前线程
Current Thread Details NULL ---------------------- 3XMTHREADINFO "WebContainer : 6" TID:0x0000000002540600, j9thread_t:0x00002AAABFA760E0, state:R, prio=5 |
找到对应的线程号"WebContainer : 6" 分析器中选择Thread Details 按钮,找到对应的线程,并查看详细对应的类和包抛出的异常,从而结合应用代码,分析导致问题的直接原因。 |
利用ha446.jar工具打开heapdump文件。
cmd运行 java –jar ha446.jar,如果heapdump比较大,可以增加启动参数,
java –jar –Xms1024m –Xmx2048m ha446.jar
如下图:
图表示当前JVM内存中对象情况分布图,有助于分析系统产生heapdump的原因。
3、查看javacore文件,如果出现Java底层的包 xxx.so文件出现异常 ,可能是WAS本身的BUG,可以考虑升级WAS版本及WAS自带JDK的版本。
如果是 xxx.so包是应用程序包,需要分析应用问题。
4、建议常出现内存溢出的server配置上如下参数。该参数可以在native_stderr.log中生成超过20m的大对象的信息,便于后期分析。对性能影响不大。
打开管理控制台, 点击 服务器 > 应用程序服务器 >server1, 点击 > java和进程管理> 进程定义 .
. 点击java虚拟机.
. 将-Xdump:stack:events=allocation,filter=#20m参数以空格相隔,添加到JVM通用参数一栏中,然后点击确定并保存.
如果需要手动生产dump文件 JVM通用参数中设置:-Xdump:java+heap:events=user
工具请自行上网下载。