这里写自定义目录标题

  • 简介
  • 理论知识
  • 实践部分
    • 1. 找到进程id
    • 2. 生成内存快照
    • 3. Java堆和方法区的详细信息、内存空间使用率、当前用的是哪种收集器

简介

这个命令非常重要,主要是生成java进程当前(当前指的是执行命令的时刻)内存堆转储快照,生成的快照经常用于分析内存溢出或者内存泄漏相关的问题。
当然,除了生成内存快照,还可以有如下作用:

  1. Java堆和方法区的详细信息
  2. 内存空间使用率
  3. 当前用的是哪种收集器

理论知识

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.hprof89473

这样我们就能在 /path-you-want-to-save 路径下生成 java-heap-dump.hprof 这个内存快照文件。

3. Java堆和方法区的详细信息、内存空间使用率、当前用的是哪种收集器

这三种信息都是通过一个命令就能实现的,输入如下命令:

jmap -heap 89473

注意,jdk9及其以上推荐使用是另一个命令即 jhsdb jmap –heap –pid 。

Attaching to process ID 6666, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.222-b10using 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% usedG1 Young Generation:Eden Space: regions= 578 capacity = 1061158912 (1012.0MB) used = 606076928 (578.0MB) free = 455081984 (434.0MB) 57.11462450592885% usedSurvivor Space: regions= 7 capacity = 7340032 (7.0MB) used = 7340032 (7.0MB) free = 0 (0.0MB) 100.0% usedG1 Old Generation: regions= 866 capacity = 1078984704 (1029.0MB) used = 876823936 (836.2044677734375MB) free = 202160768 (192.7955322265625MB) 81.26379667380345% used31790 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行分别得知总内存使用率、伊甸园区使用率、幸存区使用率和老年代使用率。