JVM内存溢出诊断方法

阅读更多

 

内存泄漏诊断步骤:

1.查看各个代的内存使用情况(一般情况都是堆内存溢出)   jmap -heap pid

2.查看jvm中对象的实例个数(找出占用内存较大的异常对象,根据程序可以初步判断是否应该存在比较大量的实例对象)  jmap -histo pid

3.查看jvm中线程个数,是否有没被回收的线程(过多的不能被回收的线程会占用一定部分堆内存),将进程中所有的线程输出到文件,根据异常线程分析代码  jstack pid

4.通过dumap出内存数据,使用MAT进行分析(工具基本可以定位到哪些代码块,以及哪些实例变量是异常的)

5.配合服务器上面装的zabbix之类的监控软件,

 

 

 

 

jmap -heap pid

查看Java 堆(heap)使用情况

 

jmap -histo pid

 查看堆内存(histogram)中的对象数量,大小

 

 

jmap -histo:live pid

这个命令执行,JVM会先触发gc,如果堆比较大,此步可能会stop the world,线上使用需要注意

 

jstat -gcutil pid 1000  

每一秒钟监控打印一次pid的gc情况,分析YGC 和FGC 是否异常

jstat命令详解: https://blog.csdn.net/zhaozheng7758/article/details/8623549

 

jstack pid

查看当前jvm进程所有的线程

 

 

jmap -dump:format=b,file=/home/quote/recevier_hk/dump.dat 26333

dump某个程序的内存数据

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,

并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用

 

 

#调查java进程中的线程数、以及都是什么线程

1.查看线程数: ps -Lf pid | wc -l    或者是top -H -p pid (查看某个进程的信息,包含线程数)

2.通过top -H -p 命令查看各个线程使用资源的情况,并找出线程id

 

 

 

MAT(linux)分析内存步骤:

1.通过jmap -dump 将运行的java进程的内存数据dump出来

2.使用MAT for linux 的工具将第一步dump出来的文件分析。

具体执行命令: 

sh ParseHeapDump.sh /home/quote/heap-Analyzer/sdata-dump.dump org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

 

3.通过第二步分析会产生几个html的页面结果

 

案例:https://www.cnblogs.com/liangzs/p/8489321.html

MAT下载:http://www.eclipse.org/mat/downloads.php

 

 

Shallow heap & Retained heap:  http://bjyzxxds.iteye.com/blog/1532937

 

 

 

 

你可能感兴趣的:(jvm,java)