简介
这个命令非常重要,主要是生成java进程当前(当前指的是执行命令的时刻)内存堆转储快照,生成的快照经常用于分析内存溢出或者内存泄漏相关的问题。
当然,除了生成内存快照,还可以有如下作用:
- Java堆和方法区的详细信息
- 内存空间使用率
- 当前用的是哪种收集器
理论知识
jmap的命令格式:
jmap [option] <pid>
其中 pid 指的是进程id,进程id可以使用 ps -ef | grep java 来查看。
具体的option见下图(该图取自《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》周志明):
实践部分
1. 找到进程id
在我的电脑命令行输入
ps -ef | grep java
可以得到如下输出:
501 89473 88963 0 11:18上午 ?? 0:00.19 /Users/jefferson/Library/Java/JavaVirtualMachines/corretto-1.8.0_342/Contents/Home/bin/java...中间信息省略.../Users/jefferson/IdeaProjects/test-only-java/out/production/test-only-java test.design.chainofresponsibility.Application
可以看到进程id是 89473。
2. 生成内存快照
输入如下命令
jmap -dump:live,format=b,file=/path-you-want-to-save/java-heap-dump.hprof 89473
这样我们就能在 /path-you-want-to-save 路径下生成 java-heap-dump.hprof 这个内存快照文件。
3. Java堆和方法区的详细信息、内存空间使用率、当前用的是哪种收集器
这三种信息都是通过一个命令就能实现的,输入如下命令:
jmap -heap 89473
注意,jdk9及其以上推荐使用是另一个命令即 jhsdb jmap --heap --pid <pid> 。
Attaching to process ID 6666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 1287651328 (1228.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 134217728 (128.0MB)
CompressedClassSpaceSize = 327155712 (312.0MB)
MaxMetaspaceSize = 335544320 (320.0MB)
G1HeapRegionSize = 1048576 (1.0MB)
Heap Usage:
G1 Heap:
regions = 2048
capacity = 2147483648 (2048.0MB)
used = 1490240896 (1421.2044677734375MB)
free = 657242752 (626.7955322265625MB)
69.39474940299988% used
G1 Young Generation:
Eden Space:
regions = 578
capacity = 1061158912 (1012.0MB)
used = 606076928 (578.0MB)
free = 455081984 (434.0MB)
57.11462450592885% used
Survivor Space:
regions = 7
capacity = 7340032 (7.0MB)
used = 7340032 (7.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 866
capacity = 1078984704 (1029.0MB)
used = 876823936 (836.2044677734375MB)
free = 202160768 (192.7955322265625MB)
81.26379667380345% used
31790 interned Strings occupying 3571440 bytes.
3.1 第 7行显示的是当前使用的G1的垃圾收集器,网上有一些讲解如何查看当前使用的垃圾收集器 ,有的回答说使用java -XX:+PrintCommandLineFlags -version,其实是不行的,比如这篇文章,
java -XX:+PrintCommandLineFlags -version 这种方式只能查看jdk默认的垃圾收集器,查看的不是当前使用的是哪个。
3.2 Java堆和方法区的详细信息可由第9行到第48行看出来,这个比较直观,不做解释了。
3.3 内存空间使用率可以从第29、36、42、48行分别得知总内存使用率、伊甸园区使用率、幸存区使用率和老年代使用率。