java生成dump文件_dump文件生成和分析查看

为啥需要内存文件

服务器CPU,内存占用空间飙升,或者GC频繁,首先需要排除的就是内存泄露,即内存中没有的对象的空间没有被及时回收导致的。而检测内存泄露就需要看哪种类在内存占了较多份额,从而定位到代码,然后修改。

分析思路

1. cpu,mem 飙升,确认是否web服务的问题并记录pid

2. 查看GC情况,如果每次gc效果不明显说明内存泄露

3. 导出dump,分析。定位占用top n的类

4. 分析并找到 哪里创建的类占用了大量

制作dump

jstack

打印线程的栈信息,制作线程Dump。

jstack <进程ID> >> <输出文件>

jstack 2316 >> c: hread.txt

## Linux下使用Kill命令制作线程Dump,输出线程Dump到目标Java进程的标准输出

kill -quit <进程ID>

kill -3 <进程ID>

jmap 

使用jmap命令制作堆Dump

# 打印存活的对象大小和个数

jmap -histo:live <pid>

jmap -histo:live 64421 > live.log

# 二进制方式存储堆文件

jmap -dump:format=b,file=文件名.hprof <进程ID>

以二进制方式生成文件/opt/wkt/wkt1.hprof,进程PID=64421

jmap -dump:format=b,file=/opt/wkt/wkt1.hprof 64421

Dump读取前基础铺垫

Dump文件内容

制作时间

Java 版本

线程信息:名称、优先级、标识、状态、堆栈

死锁信息:存在直接Java线程的死锁时才包含。

内存信息:使用kill制作时才包含。

线程信息

线程状态

NEW: 未启动的。不会出现在Dump中。

RUNNABLE: 在虚拟机内执行的。

BLOCKED: 受阻塞并等待监视器锁。

WATING: 无限期等待另一个线程执行特定操作。

TIMED_WATING: 有时限的等待另一个线程的特定操作。

TERMINATED: 已退出的。

分析模式

wait on monitor entry 被阻塞的,肯定有问题

runnable 注意IO线程

in Object.wait() 注意非线程池等待

虚拟机执行Full GC时,会阻塞所有的用户线程。因此,即时获取到同步锁的线程也有可能被阻塞。

"wss-635" waiting for monitor entry

java.lang.Thread.State: BLOCKED (on object monitor)

at com..impl.CacheHolder.isVisibleIn(CacheHolder.java:165)

- locked <0x0000000097ba9aa8> (a com..CacheHolder)

分析工具

jhat

下载生成dump二进制文件wkt1.hprof,并下载到本地。

cmd中输入:jhat wkt1.hprof

 访问:

 jvisualvm

window可视化界面,Ctr+R,CMD,输入jvisualvm回车,打开主界面后,点击【文件】下【装入】

以看到不同类占的内存大小:

java生成dump文件_dump文件生成和分析查看

1,生成文件:

1.1手动生成dump文件:

命令如下:

ps -ef | grep list-app | grep -v grep

jmap -dump:file=test.hprof,format=b 3307

1.2自动生成dump文件:

1. -XX:+HeapDumpOnOutOfMemoryError

当OutOfMemoryError发生时自动生成 Heap Dump 文件。

这是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。

2. -XX:+HeapDumpBeforeFullGC

当 JVM 执行 FullGC 前执行 dump。

3. -XX:+HeapDumpAfterFullGC

当 JVM 执行 FullGC 后执行 dump。

4. -XX:+HeapDumpOnCtrlBreak

交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。

5. -XX:HeapDumpPath=d: est.hprof

指定 dump 文件存储路径。

注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。

2,查看dump文件

推荐使用jdk自带的visualVM,其在JDK_HOME/bin目录下,可搜:jvisualvm。注意:windows系统是jvisualvm.exe文件。

然后装入快照即可。

经验分享 程序员 微信小程序 职场和发展