优质的小企业网站建设四川省四川省住房和城乡建设厅网站
最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。
一、数据抓取
在启动参数中添加参数,可参照以下设置。
 参数的作用是在程序发生内存溢出 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 后,直接等待安装即可。
 
 插件的方式也可查看内存占用情况。
