目录
一 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文件