这里写自定义目录标题
简介
这个命令非常重要,主要是生成java进程当前(当前指的是执行命令的时刻)内存堆转储快照,生成的快照经常用于分析内存溢出或者内存泄漏相关的问题。
当然,除了生成内存快照,还可以有如下作用:
- Java堆和方法区的详细信息
- 内存空间使用率
- 当前用的是哪种收集器
理论知识
jmap的命令格式:
jmap [option]<pid>
其中 pid 指的是进程id,进程id可以使用 ps -ef | grep java 来查看。
具体的option见下图(该图取自《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》周志明):
实践部分
1. 找到进程id
在我的电脑命令行输入
ps -ef |grep java
可以得到如下输出:
5018947388963011: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> 。
AttachingtoprocessID6666, please wait...Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
using thread-local object allocation.
Garbage-First(G1) GC with4thread(s)HeapConfiguration:MinHeapFreeRatio=40MaxHeapFreeRatio=70MaxHeapSize=2147483648(2048.0MB)NewSize=1363144(1.2999954223632812MB)MaxNewSize=1287651328(1228.0MB)OldSize=5452592(5.1999969482421875MB)NewRatio=2SurvivorRatio=8MetaspaceSize=134217728(128.0MB)CompressedClassSpaceSize=327155712(312.0MB)MaxMetaspaceSize=335544320(320.0MB)G1HeapRegionSize=1048576(1.0MB)HeapUsage:
G1 Heap:
regions =2048
capacity =2147483648(2048.0MB)
used =1490240896(1421.2044677734375MB)
free =657242752(626.7955322265625MB)69.39474940299988% used
G1 YoungGeneration:EdenSpace:
regions =578
capacity =1061158912(1012.0MB)
used =606076928(578.0MB)
free =455081984(434.0MB)57.11462450592885% used
SurvivorSpace:
regions =7
capacity =7340032(7.0MB)
used =7340032(7.0MB)
free =0(0.0MB)100.0% used
G1 OldGeneration:
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行分别得知总内存使用率、伊甸园区使用率、幸存区使用率和老年代使用率。
版权归原作者 jefferson-chern 所有, 如有侵权,请联系我们删除。