jmap是jdk中提供的一个用来监视进程运行中的jvm物理内存的占用情况的工具。该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。

使用jmap会影响线上运行的应用,所以尽量不要在线上执行此命令。

$  jmap -histo pid | head -n 10           查看前10位

$  jmap -histo pid | sort -k 2 -g -r     查看对象数最多的对象,按降序输出

$  jmap -histo pid | sort -k 3 -g -r       查看内存的对象,按降序输出

通过这三个命令,我们可以很清楚的看到当前进程中对象的大小及个数,从而辅助我们进行分析

hprof 文件是 Java 的 内存快照文件(Heap Profile 的缩写),格式为java_pid*.hprof

用于分析 OOM: OutOfMemoryError(堆)内存不足错误,是 JVM 设置 -XX:+HeapDumpOnOutOfMemoryError 参数时打印的内容

$ jmap -dump:format=b,file=java_${pid}.hprof   ${pid}

使用jmap把堆信息导出,生成堆转储快照dump文件,并使用可视化工具分析

以hprof二进制格式转储Java堆到指定filename的文件中

live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储

想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。