最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。
一、数据抓取
在启动参数中添加参数,可参照以下设置。
参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志,dump下来,方便用工具分析溢出情况。
-Xloggc:/home/logs/
-XX:NumberOfGCLogFiles=8
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseGCLogFileRotation
-XX:GCLogFileSize=600m
-XX:HeapDumpPath=/home/logs/
-XX:+PrintGC
明确两个命令:jmap 和 dump
jmap 是 Java 的一个命令行工具,用于打印有关 Java 堆的信息,包括不同代的大小、总堆的大小以及不同对象使用的内存量。
dump命令是一个备份文件系统的工具。它可用于创建文件系统的镜像,以便在物理设备或远程存储中进行恢复。手动dump
在Linux系统手动抓取Java栈堆记录信息,命令如下图所示。
jamp -dump:format=b,file=/dump.hprof
或者可以写个bash脚本,可循环抓取。
#! /bin/bash
read -p 'input process id' process_id
for((i=1;i<=10;i++))
do
jamp -dump:format=b,file=/dump$i.hprof $process_id
sleep 10
done
二、记录设置参数过程
1)FullGC 瞬时次数
在未指定GC算法时,用监控软件发现出现 FullGC现象,瞬时值次数达到12次。
指定G1算法,即useG1,FullGC现象消失。
可在JVM参数中指定G1,参数如下所示。
-XX:+UseG1GC
2)调整栈大小
Jvm 默认栈大小为1m,可根据实际需要调整大小,本次调整栈大小为2m,可参考以下命令。
-Xss2m
三、JVM分析工具分析
对采集到的文件,进行JVM分析主要有两个工具 Java VisualVM 和 Eclipse Memory Analyzer
在cmd下输入jvisualvm命令,可以调用出 jvisualvm 界面。
在弹出页面 选择hprof文件即可。
打开界面如下所示,可以看到堆栈中主要占用情况,点击可查看详情。
方式一、mat 软件安装
下载地址:Eclipse Memory Analyzer官网,下载页面如下图所示。
根据实际需要选择对应的版本,这里选择的是Windows版本,进入下一步,选择 Download 等待下载即可。
若镜像下载不下来,可以尝试第三方下载方式,如 mat下载。
软件下载完毕,在编辑栏 file 导入hprof 文件即可,如下图所示。
在 总览页面Overview 下展示总体情况,可点击 支配树 dominator tree
浅堆(Shallow Heap) 是指一个对象所消耗的内存。Retained Heap的大小为回收它时候能回收的heap大小,包括回收它能直接/间接引用到的对象大小的总和(不包括被GC Root直接间接引用的),从下图看出,本次是log4j日志占的比重较大。
方式二、 Mat插件
在eclipse的编辑栏 -> help -> Install New Software,如下图所示。
在弹出的页面输入 http://download.eclipse.org/mat/1.8/update-site/,如下图所示。
点击 ok 后,远程搜索,显示结果,勾选 Memory Analyzer for Eclipse IDE 即可。
点击next 后,直接等待安装即可。
插件的方式也可查看内存占用情况。