Java线上问题堆栈排查分析

最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。

一、数据抓取

在启动参数中添加参数,可参照以下设置。
参数的作用是在程序发生内存溢出 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次。
Java线上问题堆栈排查分析_第1张图片

指定G1算法,即useG1,FullGC现象消失。
Java线上问题堆栈排查分析_第2张图片

可在JVM参数中指定G1,参数如下所示。

-XX:+UseG1GC

2)调整栈大小
Jvm 默认栈大小为1m,可根据实际需要调整大小,本次调整栈大小为2m,可参考以下命令。

-Xss2m
三、JVM分析工具分析

对采集到的文件,进行JVM分析主要有两个工具 Java VisualVMEclipse Memory Analyzer

在cmd下输入jvisualvm命令,可以调用出 jvisualvm 界面。
Java线上问题堆栈排查分析_第3张图片
在弹出页面 选择hprof文件即可。
Java线上问题堆栈排查分析_第4张图片
打开界面如下所示,可以看到堆栈中主要占用情况,点击可查看详情。
Java线上问题堆栈排查分析_第5张图片
方式一、mat 软件安装
下载地址:Eclipse Memory Analyzer官网,下载页面如下图所示。
Java线上问题堆栈排查分析_第6张图片
根据实际需要选择对应的版本,这里选择的是Windows版本,进入下一步,选择 Download 等待下载即可。
Java线上问题堆栈排查分析_第7张图片
若镜像下载不下来,可以尝试第三方下载方式,如 mat下载。
软件下载完毕,在编辑栏 file 导入hprof 文件即可,如下图所示。
Java线上问题堆栈排查分析_第8张图片
在 总览页面Overview 下展示总体情况,可点击 支配树 dominator tree
Java线上问题堆栈排查分析_第9张图片
浅堆(Shallow Heap) 是指一个对象所消耗的内存。Retained Heap的大小为回收它时候能回收的heap大小,包括回收它能直接/间接引用到的对象大小的总和(不包括被GC Root直接间接引用的),从下图看出,本次是log4j日志占的比重较大。
Java线上问题堆栈排查分析_第10张图片

方式二、 Mat插件
在eclipse的编辑栏 -> help -> Install New Software,如下图所示。
Java线上问题堆栈排查分析_第11张图片
在弹出的页面输入 http://download.eclipse.org/mat/1.8/update-site/,如下图所示。
Java线上问题堆栈排查分析_第12张图片
点击 ok 后,远程搜索,显示结果,勾选 Memory Analyzer for Eclipse IDE 即可。
Java线上问题堆栈排查分析_第13张图片
点击next 后,直接等待安装即可。
Java线上问题堆栈排查分析_第14张图片
插件的方式也可查看内存占用情况。

你可能感兴趣的:(后端开发,Jvm调优,服务器,java,开发语言)