JVM 调优篇12 通过jmap获取dump文件以及jmap介绍【经典】

目录

一 Jmap命令介绍

1.1 jmap说明

1.2 获取方式

1.3 结论

1.4 关于jmap命令显示Lcom的说明

1.Lcom 的含义

二 手动获取dump方式

2.1  方式1:手动获取方式

2.2  方式2:在arthas中进行dump文件

三  自动获取dump文件

3.1 获取dump文件 

3.1.1 无堆栈溢出情况

3.1.2 设置堆栈溢出


一 Jmap命令介绍

1.1 jmap说明

jmap(JVM Memory Map):一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。

一般来说,使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一,将堆中所有存活对象导出至一个文件之中。

注意说明: 

1. 通常在写Heap Dump文件前会触发一次Full GC,所以heap dump文件里保存的都是FullGC后留下的对象信息。

2. 由于生成dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。

1.2 获取方式

1.3 结论

1.设置参数在异常发生时自动生成dump文件(没有异常时不生成dump文件,只有异常时生成dump文件)。

-XX:+HeapDumpOnOutOfMemoryError 表示当JVM发生OOM时,自动生成DUMP文件。

-XX:HeapDumpPath=存储文件/目录 表示生成DUMP文件的路径

2.手动生成dump分析文件

执行jmap -dump:format=b,file=20210321.dump 7132,其中7132是对应项目的进程PID。

将获取到的dump文件手动导入到Visual VM工具,就可以分析哪些对象占用内存高了,往往可以分析出哪些对象造成了内存泄露问。

1.4 关于jmap命令显示Lcom的说明

在使用 jmap 命令查看 Java 进程的内存信息时,如果看到以 Lcom 开头的类名,这是 JVM 内部使用的 类型描述符 表示方式。以下是详细说明:

1.Lcom 的含义

L:表示这是一个类类型(引用类型)。

com:表示类的包名(例如 com.example)。

/:用于分隔包名和类名,代替 Java 代码中的点 .

;:表示类型描述符的结束。

假设有一个类 com.example.MyClass,在 jmap 的输出中可能会显示为:

Lcom/example/MyClass;

2.解析

1)去掉前缀L和后缀;Lcom/example/MyClass; → com/example/MyClass

2)将斜杠/替换为点.; com/example/MyClass → com.example.MyClass

3.为什么会出现 Lcom 开头的类名?

JVM 内部表示:JVM 在内部使用类型描述符来表示类、方法和字段的类型。这种表示方式是为了在字节码中更高效地存储和解析类型信息。

jmap 输出:jmap 命令直接读取 JVM 的内存信息,因此输出的类名会使用 JVM 内部的类型描述符格式。

综述:Lcom 开头的类名是 JVM 内部使用的类型描述符,表示一个引用类型。

二 手动获取dump方式

2.1  方式1:手动获取方式

1.启动java程序

2.手动dump出文件

命令:F:\>    jmap -dump:format=b,file=f:/0228ljf.hprof 2164

 3.使用vm查看

2.2  方式2:在arthas中进行dump文件

三  自动获取dump文件

3.1 获取dump文件 

3.1.1 无堆栈溢出情况

1.代码: 没有设置溢出逻辑

2.设置参数

3.调用

4.查看文件:没有生成堆栈文件

3.1.2 设置堆栈溢出

1.代码,设置有溢出的逻辑

2.jvm参数设置

3.访问

4.查看文件:可以看到出现堆栈溢出时,生成dump文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值