Jmap命令参数详解(常见的7大命令)

jmap命令简介

jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。

和jinfo命令一样,在Windows系统上使用还是有一些限制的。在没有dbgeng.dll的Windows系统中,必须安装用于Windows的调试工具才能使jinfo命令正常工作,PATH环境变量应该包含jvm.dll的位置。

jmap命令使用

JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是jmap命令
Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构
jmap -heap <pid> 打印堆的使用情况
Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构
那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代)

Young Generation又被划分为:Eden Space , From Space 和 To Space

可以看到这里To区是干净的,还未被使用,From区已经使用了95%了

jmap -histo[:live] <pid> 打印类的实例数量、占用的内存、类的名称,通常我们并不需要看所有的,只需要看前几条即可
Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

jmap -dump:live,format=b,file=heap.bin <pid>

以hprof二进制格式dump堆的使用情况(PS:相当于生成一个快照,后续我们可以对这个快照文件进行分析)
Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

jmap命令参数

命令语法:

jmap [options] pid

命令参数说明:

  • option:jmap命令的可选参数。如果没有指定这个参数,jinfo命令会显示Java虚拟机进程的内存映像信息,如下图:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

  • pid:要打印配置信息的Java虚拟机的进程ID。

想要要获取运行的Java虚拟机进程的列表,可以使用ps命令(Linux系统中)或tasklist命令(Windows系统中),如果Java虚拟机进程没有在单独的docker实例中运行,可以使用jps命令。

option都有哪些参数呢?我们来看一下。

-heap

显示Java堆的如下信息:

  • 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
  • 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
  • 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。

比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-histo[:live]

显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名。比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

要获得某个对象的大小,可以将其总大小除以该对象类型的数量。如果指定了live参数,则只计算活动的对象。比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-clstats

显示Java堆中元空间的类加载器的统计信息,包括:

class_loader:当Java虚拟机运行时,类加载器对象的地址 classes:已加载类的数量 bytes:该类加载器加载的所有类的元数据所占的字节数 parent_loader:父类加载器对象的地址,如果没有显示null。 alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。 type:该类加载器的类名。

比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-permstat <pid>

通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。

-finalizerinfo

显示在F-Queue中等待Finalizer线程执行finalize方法的对象。比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-dump:[live,]format=b,file=

生成Java虚拟机的堆转储快照dump文件。具体说明如下:

  • live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
  • format=b表示以hprof二进制格式转储Java堆的内存。
  • file=<filename>用于指定快照dump文件的文件名。

比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-F

强制模式。如果指定的pid没有响应,可以配合-dump-histo一起使用。此模式下,不支持live参数。比如:

Jmap命令参数详解(常见的7大命令)-mikechen的互联网架构

-h 和 -help

显示jinfo命令的帮助信息。

以上!

关注「mikechen的互联网架构」公众号,回复【架构】即可获取mikechen原创99万字进阶架构师300期文章合集

包含:Java多线程与并发系列、分布式架构系列、Spring系列、MySQL系列、微服务系列、Redis系列...等文章合集。

评论交流
    说说你的看法