1、问题描述:
使用命令 jstat -gcutil [pid] 查看JVM GC日志,发现生产系统频繁FullGC,大概几分钟一次,而且系统响应速度变慢很多
再使用 free -g 查看服务器内存全部占用,猜测是内存溢出了
2、导出dump日志
jmap -dump:live,format=b,file=heap.hprof 18051
使用如上命令导出gc日志,其中18051是java线程ID需要自己查询
执行成功后,会在执行命令的文件夹下面生成 heap.hprof 这个文件
3、本地分析日志
打开 Eclipse memory analyzer 解压文件夹
如果dump日志文件很多,需要修改软件配置大小,修改MemoryAnalyzer.ini文件Xmx参数如下
双击运行软件:
运行上面文件,打开界面后 点击左上角 file -> Open Heap Dump 选择上面的heap.hprof文件
选择文件,进行分析成功后显示如下界面:
点击上图红框进入泄露页面:
keywords已经显示代码问题大概,点击下面的details查看详情
打开可以看到是LIst占用了很大空间,也可以查看Thread Stack,如下图所示
4、服务器直接分析日志
如果日志文件很大的话,下载到本地需要很多的时间,而且打开也可能会报错,这时候我们可以在服务器直接进行分析,操作步骤如下:
1、上传 Eclipse memory analyzer linux版本到linux服务器,并使用unzip 解压上传后文件,解压后如下图所示
2、复制dump文件到相同文件夹,也可以新建文件夹,因为分析完成后,会生成很多分析文件
3、运行命令执行分析,这里注意需要修改analyzer配置文件设置内存空间大于需要分析的日志文件,这里设置30000M
运行命令:
./ParseHeapDump.sh heap.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
分析成功后如下图所示:
主要文件是途中三个zip文件,下载到本地,解压后打开文件夹里面的.index页面,也会显示分析图,只是没有直接使用软件详细