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的信息是可靠的,所以会暂停应用, 线上系统慎用。