0


jmap详解

这里写自定义目录标题

简介

这个命令非常重要,主要是生成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

可以得到如下输出:

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行分别得知总内存使用率、伊甸园区使用率、幸存区使用率和老年代使用率。

标签: jvm java linux

本文转载自: https://blog.csdn.net/jeffersonchern/article/details/127440975
版权归原作者 jefferson-chern 所有, 如有侵权,请联系我们删除。

“jmap详解”的评论:

还没有评论