java 内存爆满排查命令

    要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多.

1. top 一下获取内存占用率最高的pid。

2. 转到 jdk的bin目录,执行jdk命令。

一. jstat

 (1)./jstat  -gc pid 查看gc的次数,及时间。最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

 jstat -gc pid [interval] 命令查看了 Java 进程的 GC 状态,果然,FULL GC 达到了每秒一次

 这么多的 FULL GC,应该是内存泄漏没跑了,于是使用 jstack pid > jstack.log 保存了线程栈的现场。

使用 jmap -dump:format=b,file=heap.log pid 保存了堆现场,然后重启了探测服务,报警邮件终于停止了。

    (2)./jstat -gcutil pid  统计gc信息统计

二. jmap

(1)./jmap -heap pid  查看JVM空间总体使用情况

(2)./jmap -histo  pid |more  查看类的实例数和内存量

(3)./jmap -histo:live pid |more 查看所有活着的实例数量。

(4)./jmap -dump:format=b,file=dump_tomcat.dat pid 将内存使用情况dump到文件中

3. 使用MAT工具对dump文件进行分析。

下载MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰
富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
下载地址:http://www.eclipse.org/mat/downloads.php
然后解压,跟eclipse一样,我们直接启动就可以了,启动界面如下,我们点击左上角“file”或者红框中的“Open a Heap Dump”就可以打开我们的Dump文件。

 

 Dump文件后缀问题,找不到Dump文件时选择All file,就可以看到了

 2. 选择Leak Suspects Report(泄露嫌疑报告),进入到主界面

 3. 看到主界面,Problem区域就是提示可能有问题的类的信息了,我们可以看到,有一个类的实例占了700M左右,占用了内存总量90%以上了,点击Details可以查看详情,点击See stacktrace可以查看跟踪堆栈找到问题代码所在位置。

 其中深蓝色的部分就为内存泄漏的部分,java的堆内存一共只有717.8 M而内存泄漏的部分独自占有了72.8 M所以本次的内存泄漏很明显。

 4. 下图可以看出来这个对象占用了很多的内存

 当然我们也可以切换视图,查看具体对象的一些信息,可以看到这个class生成了133w个实例,肯定是代码出问题了

跟踪代码,定位泄露位置

点击See stacktrace,下图是跟踪的代码位置,可以清晰的看到是第几行生成的对象,进而分析代码

 

 

原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/15701817.html