Dump文件生成,内容,以及分析

article/2025/8/31 15:16:21

​​​​​​​本文用到的工具只是简单介绍,让你有个感官认识,重点是核查思路的熟悉

为啥需要dump内存文件

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


分析思路

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

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

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

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


制作dump

jstack

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

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

jstack 2316 >> c:\thread.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: 已退出的。

监视器(Monitor)

监视器:对象锁的访问控制结构。也指对象的锁。

监视器项:线程的代理人。

进入区:表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则进入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

拥有者:表示某一线程成功竞争到对象锁。

等待区:表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。

调用修饰

locked <地址> 目标

waiting to lock <地址> 目标

waiting on <地址> 目标

parking to wait for <地址> 目标

实例锁: (a 类名)——synchronized对象。

类锁:(a Class for 类名)——静态synchronized方法

locked:通过synchronized关键字,成功获取到了对象的锁,成为监视器的拥有者,在临界区内操作。对象锁是可以线程重入的。

at oracle.jdbc.driver.PhysicalConnection.prepareStatement

- locked <0x00002aab63bf7f58> (a oracle.jdbc.driver.T4CConnection)

at oracle.jdbc.driver.PhysicalConnection.prepareStatement

- locked <0x00002aab63bf7f58> (a oracle.jdbc.driver.T4CConnection)

at com..datasource.PooledConnection.prepareStatement

synchronized (conn) { // conn的类型是T4CConnection

// 同步块操作

}

waiting to lock:通过synchronized关键字,没有获取到了对象的锁,线程在监视器的进入区等待。在调用栈顶出现,线程状态为Blocked​​​​​​​​​​​​​​

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

- waiting to lock <0x0000000097ba9aa8> (a CacheHolder)

at com..impl.CacheGroup$Index.findHolder

at com..impl.ContextImpl.find

at com..BaseDataCenter.findInfo

synchronized (holder) { // holder的类型是CacheHolder

// 临界区操作

}

waiting on:通过synchronized关键字,成功获取到了对象的锁后,调用了wait方法,进去对象的等待区等待。在调用栈顶出现,线程状态为WAITING或TIMED_WATING

at java.lang.Object.wait(Native Method)

- waiting on <0x00000000da2defb0> (a WorkingThread)

at com..WorkingManager.getWorkToDo

- locked <0x00000000da2defb0> (a WorkingThread)

at com..WorkingThread.run

synchronized(thread) {

     // 同步块操作……

     try {

           thread.wait();

     catch(InterruptException e) { /* 中断异常处理 */ }

}

parking to wait for

at sun.misc.Unsafe.park(Native Method)

- parking to wait for <0x00000000eb8f35c8> (a FutureTask$Sync)

at java.util.concurrent.locks.LockSupport.park(LockSupport:156)

...

at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock()

park是基本的线程阻塞原语,不通过监视器在对象上阻塞。

随concurrent包会出现的新的机制,与synchronized体系不同。

synchronized模型相关的调用修饰

1.locked <对象地址> (a 类名)

使用synchronized申请对象锁成功,监视器的拥有者。

2. waiting to lock <对象地址> (a 类名)

使用synchronized申请对象锁未成功,在进入区等待。

3. waiting on <对象地址> (a 类名)

使用synchronized申请对象锁成功后,释放锁并在等待区等待

分析模式

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

 访问:http://localhost:7000/

jvisualvm

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

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

Jvm.分析工具(jps,jmap,jstack,jinfo,jconsole,jvisualvm,arthas,jprofiler,mat)_闲猫的博客-CSDN博客

MAT

MAT(MemoryAnalyzerTool)是Eclipse提供的一个内存分析工具,作为Java的内存分析中一个比较好用的工具,掌握MAT的基本用法基本上算是定位问题中一项最重要的基础技能了。

下载地址:链接:https://pan.baidu.com/s/1Qyy1bJQtosNlJ9VOt9GzVA 提取码:8hgd

Jvm.分析工具(jps,jmap,jstack,jinfo,jconsole,jvisualvm,arthas,jprofiler,mat)_闲猫的博客-CSDN博客


http://chatgpt.dhexx.cn/article/ASpaqKOP.shtml

相关文章

java dump可视化在线内存分析工具

方便分析内存、线程使用情况、死锁等情况的在线可视化分析dump工具 一般也可以自己装MAT&#xff0c;JProfiler等工具&#xff0c;但是这个在线可视化HeapHero分析dump非常全面&#xff0c;总之&#xff0c;非常nice。 HeapHero https://heaphero.io/index.jsp 导出dump并上传…

mac pro m1:安装dump文件内存分析工具——MAT

0. 引言 本文主要针对mac m1下安装Jprofiler进行讲解&#xff0c;安装核心步骤同样适用于其他系统 1. 安装 如果使用的是eclipse可以在插件中直接安装MAT&#xff0c;因为我使用的是idea开发&#xff0c;所以选择独立安装MAT工具 1、下载地址&#xff1a;https://www.eclip…

使用WinDbg分析Windows dump文件方法

需要使用WinDbg工具来分析windows系统产生的dump文件&#xff0c;此工具属于Windows SDK的一个组件&#xff0c;在微软官方网站可以下载&#xff08;链接&#xff09;。 在安装Windows SDK的过程中&#xff0c;可以选择只安装WinDbg&#xff08;Debugging Tools for Windows&a…

jvm mat分析dump文件

jvm调优中&#xff0c;经常使用dump来分析是否存在大对象导致频繁full gc&#xff0c;以下为使用步骤&#xff1a; 一、获得服务进程 二、生成dump文件 jmap -dump:formatb,filexxx.dump pid 三、下载mat工具 地址:https://www.eclipse.org/mat/downloads.php 注意&#xff0c;…

jvm---6.1、dump 文件分析工具 IBM HeapAnalyzer

IBM HeapAnalyzer 工具 官网&#xff1a; https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid4544bafe-c7a2-455f-9d43-eb866ea60091 官网翻译如下&#xff1b; HeapAnalyzer允许通过启发式搜索引擎查找可能的Java™堆泄漏区域…

linux dump 分析工具,使用 Crash 工具分析 Linux dump 文件

与具有众多的内存转储机制一样&#xff0c;Linux 下也有众多的内存转储分析工具&#xff0c;下面将会逐一做简单介绍。 Lcrash 是随 LKCD 一起发布的一个内内存储分析工具。随着 LKCD 开发的停止&#xff0c;lcrash 的开发也同时停止了。目前它的代码已经被合并进入 Crash 工具…

.NET -- 使用Dump文件分析异常

目录 1. Dump文件 2. 程序崩溃时自动生成Dump文件 2.1 注册表生成 2.2 代码生成 3. 手动生成Dump文件 3.1 任务管理器生成 3.2 VS生成 4. Dump文件调试分析 4.1 简易崩溃测试代码 4.2 VS2022调试 4.3 非本机测试 1. Dump文件 Dump文件是进程的内存镜像。可以把程序…

java heapdump 分析工具_heapdump分析工具

heapdump分析工具是一款强大的数据分析工具&#xff0c;它可以用图表的形式来展现相应的分析结果&#xff0c;在使用heapdump分析工具之前请先安装JDK1.6。 运行环境 1.运行环境要求JDK 1.6或以上 如果JDK版本过低&#xff0c;报错如下&#xff1a; Exception in thread "…

php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...

从Win8系统开始到Win10&#xff0c;蓝屏界面大变脸&#xff0c;不再显示详细的代码错误文件&#xff0c;看起来是友好多了不过对用户查找回题原因来说就麻烦不少了~好在Win8/win10 在蓝屏时会生成dump文件&#xff0c;我们可以使用专用工具进行分析解读查找到问题所在。下面小编…

Dump文件分析工具 - MAT图文解析

/ 前言 / 在讲解Mat工具之前我们先来看下几个关于Dump/文件的问题 Dump文件是什么 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中 我们拿到Dump文件有什么用的? 假如JVM因为内存溢出的原因宕机了, 而程序的日志里面并没有关于溢出所在对象的信息…

【华为云技术分享】干货分享丨jvm系列:dump文件深度分析

摘要&#xff1a;java内存dump是jvm运行时内存的一份快照&#xff0c;利用它可以分析是否存在内存浪费&#xff0c;可以检查内存管理是否合理&#xff0c;当发生OOM的时候&#xff0c;可以找出问题的原因。那么dump文件的内容是什么样的呢&#xff1f; JVM dump java内存dump是…

Java的dump文件分析及JProfiler使用

Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上&#xff0c;dump文件就是当程序产生异常时&#xff0c;用来记录当时的程序状态信息&#xff08;例如堆栈的状态&#xff09;,用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…

获取和分析Dump的几种工具简介

最近在进一步学习support技能的时候&#xff0c;了解到分析Dump的重要性&#xff0c;经过学习&#xff0c;做一些笔记。 一、什么是Dump文件。 Dump文件时进程的内存镜像。可以把程序的执行状态保存到Dump文件中。Dump文件分为内核模式Dump和用户模式Dump。其中内核模式Dump是…

JVM-通过MAT工具对dump文件进行分析

文章目录 MAT工具介绍下载安装使用OverviewHistogramDominator_TreeOQLThread_OverviewLeak Suspects MAT工具介绍 MAT(Memory Analyzer Tool)&#xff0c;一个基于Eclipse的内存分析工具&#xff0c;是一个快速、功能丰富的JAVA heap分析工具&#xff0c;它可以帮助我们查找内…

错误号码2058:Plugin caching sha2_password could not be loaded

安装SQLyog之后&#xff0c;新建接口&#xff0c;输入密码&#xff0c;点击连接&#xff0c;发现出现了如下的错误&#xff1a; 1.错误的原因 SQLyog加密方式出现了错误&#xff0c;这时由于 插件缓存——sha2_密码无法进行加载所导致的。 2.解决方法 在开始菜单中输入命令…

2023/06/28

文章目录 1.export和export default的区别2.npm和cnpm的区别3.npm run dev/serve的区别4.slice、splice和split的区别 1.export和export default的区别 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

02.07 SQLyog连接MySQL数据库时报2058错误(转载)

使用SQLyog连接MySQL时报了这样一个错 “错误号码2058&#xff0c;Plugin caching——sha2_passward could not be loaded:******** ”(乱码) 将报错信息翻译&#xff1a;“插件缓存——sha2_密码无法进行加载”&#xff0c;这是由于你的SQLyog mysql 密码加密方法变了&#…

【C++】2058:【例3.10】简单计算器(信息学奥赛)

好了&#xff0c;今天的内容就是有简单计算器了&#xff0c;内容的详细意思也就是一个最简单的计算器支持&#xff0c;-&#xff0c;*&#xff0c;/四种运算然后根据输入输出结果。&#xff08;博主正在冲200粉丝&#xff0c;喜欢的赶紧关注&#xff01;&#xff01;&#xff0…

【MySQL2058】MySQL远程连接错误码2058

Docker安装的MySQL&#xff0c;突然服务器登录正常&#xff0c;但是使用SQLyog登录报异常&#xff1a; MySQL错误号码 2058上网上巴拉巴拉半天&#xff0c;各种说法都有&#xff0c;最后综合网上各种教程方案&#xff0c;解决了自己的问题&#xff0c;最后将自己的解决方案罗列…

解决SQLyog连接MySQL出现2058错误

解决SQLyog连接MySQL出现2058错误 1、确定你的mysql命令能运行&#xff0c;像下面这样&#xff1a; 2、如果出现这种情况&#xff1a; 解决方法一&#xff1a; 配置系统环境变量path的值&#xff0c;将安装MySQL路径下的bin路径&#xff1a;MySQL安装目录\bin&#xff0c;配置…