jmap(Memory Map)用来查看堆内存使用状况,一般结合jhat(Java Heap Analysis Tool)使用。语法格式如下:

    1. jmap [option] pid
    2. jmap [option] executablecore
    3. jmap [option] [server-id@]remote-hostname-or-ip

    1.没有参数打印进程的类加载器和类加载器加载的持久代对象信息,

    输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:

    1. jmap pid

    jmap和jhat - 图1
    2.查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。比如下面的例子:

    1. jmap -heap pid

    jmap和jhat - 图2
    3.使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象并且会强制执行一次GC,如下:

    1. jmap -histo pid
    2. jmap -histo:live pid

    jmap和jhat - 图3
    jmap和jhat - 图4
    class name是对象类型,说明如下:

    1. B byte
    2. C char
    3. D double
    4. F float
    5. I int
    6. J long
    7. Z boolean
    8. [ 数组,如[I表示int[]
    9. [L+类名 其他对象

    还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

    1. jmap -dump:format=b,file=dumpFileName pid (文件的后缀建议采用".hprof")

    jmap和jhat - 图5
    dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:

    1. jhat -port xxxx dumpFileName

    image.png

    然后就可以在浏览器中输入主机地址:port查看了:
    jmap和jhat - 图7