JVM——dump内存文件学习

什么是dump文件?

dump文件是一个进程或者系统在某一个给定的时间的快照,包含了一些程序运行时的各种信息,一般是被专业人员用来分析获取信息,然后给程序调试排错。在服务器运行我们的Java程序时,是无法跟踪代码的,所以当发生线上事故时,dump文件就成了一个很关键的分析点。

JVM 的线程堆栈 dump 也称 thread dump,内容为文本,以栈的形式来记录,主要包含当时 JVM 的线程堆栈。堆dump 也称 heap dump,内容为二进制格式,主要包含当时 JVM 堆内存中的内容。由于各个操作系统、各个 JVM 实现不同,即使同一 JVM 实现,各个版本也有差异。堆栈和堆的内容在定位问题的时候,都是非常重要的信息。

线程堆栈文件thread dump

线程堆栈文件 thread dump 可以了解当时 JVM 中所有线程的运行情况,比如线程的状态和当前正在运行的代码行。thread dump需要结合占用系统资源的线程id才有意义。

堆栈文转储件heap dump

堆转储文件 heapdump 可以了解当时堆的使用情况,是某个时间点、Java 进程的内存快照。包含了当时内存中还没有被 full GC 回收的对象和类信息,比如各个类实例的数量及各个实例所占用的空间大小。在内存溢出(OOM)时可以使用该文件进行分析和故障定位。

dump文件获取

获取dump文件,我们可以选择JDK自带的工具进行自动生成。

获取 thread dump

JDK自带命令行工具获取PID,再获取thread dump:

1. jps 或 ps –ef|grep java (获取PID)

2. jstack [-l ]<pid> > filename  (获取thread dump)

测试,启动一个tomcat服务器,然后获取thread dump文件

获取therad dump文件
threaddump_test.txt

获取 heap dump


JDK自带命令行工具获取PID,再获取heap dump:

1. jps 或 ps –ef|grep java (获取PID)

2. jmap -dump:format=b,file=filename 1<pid>  (获取heap dump)

jmap -dump:live,format=b,file=filename 1<pid>(只dump堆中存活的对象)

测试获取heap dump文件

获取heap dump文件

dump文件结构解析

thread dump分析

头部信息:时间、JVM信息

2022-01-04 19:26:31
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.241-b07 mixed mode):

线程INFO信息块

"http-nio-8081-exec-8" #39 daemon prio=5 os_prio=0 tid=0x0000000020be4000 nid=0xab8 waiting on condition [0x0000000023d7e000]
java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
	    - parking to wait for  <0x00000006c32d2198> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
#线程名称:http-nio-8081-exec-8;线程类型:daemon;优先级:5,默认为5;操作系统优先级:0
#JVM线程id:tid=0x0000000020be4000,JVM内部线程的唯一标识(通过java.lang.Thread.getId()获取,通常用自增方式实现)
#对应系统线程id(NativeThread ID):nid=0xab8,使用十六进制表示的pid
#线程状态:waiting on condition
#起始栈地址:[0x0000000023d7e000],对象的内存地址,通过JVM内存查看工具,能够看出线程是在哪个对象上等待;

线程状态

deadlock

死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法释放的情况。

runnable

一般指该线程正在执行状态中。

blocked

线程正处于阻塞状态。

waiting on condition

线程正处于等待资源或等待某个条件的发生,具体的原因需要结合堆栈信息进行分析。

  • 可能是在等待锁资源
  • 可能是在sleep
  • 可能是网络资源不足,这个要结合系统的使用信息来看。
waiting for monitor entry 或 in Object.wait()

java中synchronized的重量级锁借助Moniter 来实现。Moniter 有两个队列。一个是entry set,另一个是wait set。当synchronized 升级到重量级锁后,竞争锁失败的线程将记录到entry set中,这时线程状态是waiting for monitor entry;而竞争到锁的线程若调用锁对象的wait方法时,则记录 到wait set中,这时线程状态是 in Object.wait()

heap dump分析

为何会内存溢出

内存管理架构

JVM根据generation(代)来进行GC(垃圾回收),根据上图所示,被分为young generation(年轻代)、tenured generation(老年代)

Generation比例分配

绝大多数的对象都在young generation被分配,也在young generation被收回,当young generation的空间被填满,GC会进行minor collection(次回收),速度非常快。其中,young generation中未被回收的对象被转移到tenured generation,当tenured generation被填满时,即触发major collection(FULL GC主回收),整个应用程序都会停止下来直到回收完成

因此产生heapdump的原因一般有以下几个原因

  1. JVM内存过小
  2. 程序不严密,产生某种溢出错误
  3. 产生过多的垃圾无法回收

常见的heapdump分析工具

jhat

jhat 是JDK自带的用于分析JVM Heap Dump文件的工具,使用下面的命令可以将堆文件的分析结果以HTML网页的形式进行展示

jhat <heap-dump-file>

其中 heap-dump-file 是文件的路径和文件名,可以使用 -J-Xmx512m 参数设置命令的内存大小。执行成功之后显示如下结果

Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

这个时候访问 http://localhost:7000/ 即可以看到结果了

http://localhost:7000
Eclipse Memory Analyzer(MAT)

Eclipse Memory Analyzer(MAT)是Eclipse提供的一款用于Heap Dump分析的工具,用来辅助发现内存泄漏减少内存占用,从数以百万计的对象中快速计算出对象的 Retained Size,查看并自动生成一个 Leak Suspect(内存泄露可疑点)报表。

MAT主界面
选择Leak Suspects Report 内存泄露报表

分析完成之后dump文件信息如下

dump文件信息

zip文件是生成的html形式的报告文件

界面功能

主界面

a、Overview(视图):概要界面,显示了概要的信息,并展示了MAT常用的一些功能。

Details 显示了一些统计信息,包括整  个堆内存的大小、类(Class)的数量、对象(Object)的数量、类加载器(Class Loader)的数量。

Biggest Objects by Retained Size 使用饼图的方式直观地显示了在JVM堆内存中最大的几个对象,当光标移到饼图上的时候会在左边Inspector和Attributes窗口中显示详细的信息。

Actions 这里显示了几种常用到的操作,算是功能的快捷方式,包括 Histogram、Dominator Tree、Top Consumers、Duplicate Classes,具体的含义和用法见下面;

Reports 列出了常用的报告信息,包括 Leak Suspects和Top Components,具体的含义和内容见下;

Step By Step 以向导的方式引导使用功能。

b、Histogram(直方图):可以查看每个类的实例(即对象)的数量和大小。

c、Dominator Tree(支配树):列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。

d、OQL(MAT提供的对象查询语言):跟SQL语言类似,将类当作表、对象当作记录行、成员变量当作表中的字段,通过OQL可以方便快捷的查询一些需要的信息。

e、Thread Overview:查看生成Heap Dump文件的时候线程的运行情况,用于线程的分析

f、Run Expert System Test:查看分析完成的HTML形式的报告,子菜单项如下图所示

子菜单项

常用的主要有Leak Suspects和Top Components两种报告:


Leak Suspects :该报告分析了Heap Dump并尝试找出内存泄漏点,最后在生成的报告中对检测到的可疑点做详细的说明;
Top Components :列出占用总堆内存超过1%的对象

VisualVM

VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇