JDK 常用工具 —— jmap 详解
•
Jave
jmap 是 JDK 自带的一个命令行工具,可以用于生成 Java Heap Dump 文件,以及查看 Java 进程中的内存使用情况。
本文内容来自一篇整理得非常详细的文档: https://juejin.cn/post/6844904062526160904
语法
jmap [option] jmap [option] <executable (to connect to a core file) jmap [option] [server_id@] (to connect to remote debug server)
option:命令选项,常用选项如下:
- -heap:打印 Java 堆概要信息,包括使用的 GC 算法、堆配置参数和各代中堆内存使用情况;
- -histo[:live]: 打印 Java 堆中对象直方图,通过该图可以获取每个 class 的对象数目,占用内存大小和类全名信息,带上 :live,则只统计活着的对象;
- -permstat 打印永久代统计信息;
- -finalizerinfo 打印等待回收的对象信息
- -dump: 以 hprof 二进制格式将 Java 堆信息输出到文件内,该文件可以用 JProfiler、VisualVM 或 jhat 等工具查看;
dump-options 选项:
- live 只输出活着的对象,不指定则输出堆中所有对象
- format=b 指定输出格式为二进制
- file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin
- -F 与-dump: 或 -histo 一起使用,当没有响应时,强制执行;注意:不支持live子选项
- pid:进程id
示例
jmap -heap pid
> jmap -heap 10352 jmap -heap 10352 Attaching to process ID 10352, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.201-b09 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(defalut 40) MinHeapFreeRatio = 0 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70) MaxHeapFreeRatio = 100 //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小 MaxHeapSize = 4280287232 (4082.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小 NewSize = 89128960 (85.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 MaxNewSize = 1426587648 (1360.5MB) //对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老年代’的大小 OldSize = 179306496 (171.0MB) //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 NewRatio = 2 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 SurvivorRatio = 8 //对应jvm启动参数-XX:MetaspaceSize=:设置JVM堆的‘元空间’的初始大小 // jdk1.8 永久代已经被元空间所取代 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxMetaspaceSize= :设置JVM堆的‘元空间’的最大大小 MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) //堆内存分布 Heap Usage: //新生代的内存分布 PS Young Generation //Eden区内存分布 Eden Space: //Eden区总容量 capacity = 1425539072 (1359.5MB) //Eden区已使用 used = 28510792 (27.19001007080078MB) //Eden区剩余容量 free = 1397028280 (1332.3099899291992MB) //Eden区使用比率 2.0000007407724003% used From Space: capacity = 524288 (0.5MB) used = 65536 (0.0625MB) free = 458752 (0.4375MB) 12.5% used To Space: capacity = 524288 (0.5MB) used = 0 (0.0MB) free = 524288 (0.5MB) 0.0% used PS Old Generation capacity = 128974848 (123.0MB) used = 24006808 (22.894676208496094MB) free = 104968040 (100.1053237915039MB) 18.613557893086256% used 13410 interned Strings occupying 1194568 bytes.
jmap -histo pid
>jmap -histo 10352 num #instances #bytes class name ---------------------------------------------- 1: 27073797 433180752 java.lang.Integer 2: 5442 16503144 [I 3: 5005 6143944 [B 4: 33835 3446608 [C 5: 9721 855448 java.lang.reflect.Method 6: 33751 810024 java.lang.String 7: 6494 717416 java.lang.Class 8: 14303 457696 java.util.concurrent.ConcurrentHashMap$Node ...
jmap -histo:live pid
统计 heap 中所有生存的对象的情况, 这个命令会先触发 gc 再统计:
> jmap -histo:live 10352 num #instances #bytes class name ---------------------------------------------- 1: 27483 2670608 [C 2: 6453 713152 java.lang.Class 3: 27300 655200 java.lang.String 4: 12861 411552 java.util.concurrent.ConcurrentHashMap$Node 5: 6364 327688 [Ljava.lang.Object; 6: 2496 219648 java.lang.reflect.Method 7: 874 178440 [B ...
jmap -dump:live,format=b,file=a.log pid
执行这个命令,JVM 会将整个 heap 的信息 dump 到一个文件,heap 如果比较大的话会导致这个过程比较耗时,并且执行的过程中为了保证 dump 的信息是可靠的会暂停应用。
该命令通常用来分析内存泄漏 OOM,通常做法是:
- 首先配置 JVM 启动参数,让 JVM 在遇到 OutOfMemoryError 时自动生成 Dump 文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
- 使用命令 Dump Heap 信息
jmap -dump:format=b,file=/path/heap.bin pid
- 使用 MAT 分析工具,如 jhat 命令分析 hprof 文件
常用命令
- 查看大对象:
jmap -histo |less
- 查看对象数最多的对象,并按降序排序输出:
jmap -histo |grep alibaba|sort -k 2 -g -r|less
- 查看占用内存最多的对象,并按降序排序输出:
jmap -histo |grep alibaba|sort -k 3 -g -r|less
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/c3130462ef.html
