jmap
- jmap(memory map for java) 该命令用于生成java 堆转储快照,配置
-XX:+HeapDumpOnOutOfMemeryError
发生OOM时生成快照,-XX:+HeapDumpOnCtrlBreak
按ctrl+break 生产快照,linux 下使用kill -3 pid
退出命令“吓一吓”虚拟机,也会生成dump 文件。- jmap 除获取堆转储快照,还可以查询 finalize 执行队列、java堆和方法区详细信息(空间使用率,使用GC垃圾回收器等)
-
命令
jmap [option] pid
-
dump
生成java 转储快照,格式 -dump:[live,] format=b, file=, live 是否只dump存储对象
[root@guanzc-206 jar]# jmap -dump:format=b,file=dumpName.bin 38820 -F Dumping heap to /root/jar/dumpName ...
-
finalizerinfo
在F-Queue 中等待Finalizer线程执行 finalize 方法的对象,仅用于window 无效
[root@guanzc-206 jar]# jmap -finalizerinfo 39649 Attaching to process ID 39649, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 Number of objects pending for finalization: 0 [root@guanzc-206 jar]#
-
heap
堆的详细信息,垃圾回收器、参数配置、分代状况等。window无效
[root@guanzc-206 jar]# jmap -heap 39649 Attaching to process ID 39649, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Mark Sweep Compact GC #标记回收 Heap Configuration: #堆配置 MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率 MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 MaxHeapSize = 478150656 (456.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 10485760 (10.0MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小 MaxNewSize = 159383552 (152.0MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 OldSize = 20971520 (20.0MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小 NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 MetaspaceSize = 21807104 (20.796875MB) # -XX:+MetaspaceSize= 元空间大小 CompressedClassSpaceSize = 1073741824 (1024.0MB) # 压缩类空间大侠 Heap Usage: MaxMetaspaceSize = 17592186044415 MB # -XX:+MaxMetaspaceSize= 最大元空间 G1HeapRegionSize = 0 (0.0MB) # G1在堆中分区大小,垃圾回收用 Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 9502720 (9.0625MB) used = 1858248 (1.7721633911132812MB) free = 7644472 (7.290336608886719MB) 19.554906384698278% used Eden Space: capacity = 8454144 (8.0625MB) used = 1507784 (1.4379348754882812MB) free = 6946360 (6.624565124511719MB) 17.8348511688469% used From Space: capacity = 1048576 (1.0MB) used = 350464 (0.334228515625MB) free = 698112 (0.665771484375MB) 33.4228515625% used To Space: capacity = 1048576 (1.0MB) used = 0 (0.0MB) free = 1048576 (1.0MB) 0.0% used tenured generation: #老年代 capacity = 20971520 (20.0MB) used = 12342320 (11.770553588867188MB) free = 8629200 (8.229446411132812MB) 58.85276794433594% used 12566 interned Strings occupying 1050904 bytes.
-
histo
显示堆中统计信息,类,实例数量、合计容量
num #instances #bytes class name ---------------------------------------------- 1: 37279 3740984 [C 2: 5771 1720144 [I 3: 35585 854040 java.lang.String 4: 3607 824480 [B 5: 8529 750552 java.lang.reflect.Method 6: 6479 717720 java.lang.Class 7: 20414 653248 java.util.concurrent.ConcurrentHashMap$Node 8: 6628 370872 [Ljava.lang.Object; 9: 7478 299120 java.util.LinkedHashMap$Entry 10: 3121 278896 [Ljava.util.HashMap$Node; 11: 131 265648 [Ljava.util.concurrent.ConcurrentHashMap$Node; 12: 13575 217200 java.lang.Object 13: 6741 215712 java.util.HashMap$Node 14: 7779 175592 [Ljava.lang.Class; 15: 2989 167384 java.util.LinkedHashMap 16: 4451 142432 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node ...
-
permstat
以Classloader 为统计口经显示永久代内存状态,window 有效
-
F
虚拟机执行-dump 无响应时,强制生成dump 快照,window 无效
[root@guanzc-206 jar]# jmap -dump:format=b,file=dup.bin -F 41262
jhat
jhat(JVM Heap Analysis Tool) 虚拟机堆存储快照分析工具,与jmap 结合使用,分析jmap 生成的转储快照。内置了HTTP/WEB服务器,结果能在浏览器查看,默认端口
7000
。建议不在应用服务器上执行 jhat ,会损耗服务器性能。
[root@guanzc-206 jar]# jhat dump.bin
Reading from dump.bin...
Dump file created Sat Sep 19 21:54:58 CST 2020
Snapshot read, resolving...
Resolving 271309 objects...
Chasing references, expect 54 dots......................................................
Eliminating duplicate references......................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
以包的形式显示
jstack
jstack(Stack Trace For Java) java堆跟踪工具。生成虚拟机当前时刻的线程快照(threaddump或者javacore 文件)。当前这在执行每一条线程堆栈集合,定位线程停顿原因,排查死锁,挂起,外部调用等
-
F
正常输入不被响应时,强制输出堆栈
-
l
除堆栈外,锁信息
[root@guanzc-206 jar]# jstack -l 41262 "41" #70 daemon prio=5 os_prio=0 tid=0x00007f952c150800 nid=0xa188 waiting on condition [0x00007f950d196000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.ikang.service.ThreadService.lambda$testThread$0(ThreadService.java:15) at com.ikang.service.ThreadService$$Lambda$477/503680309.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None
-
m
调用外部方法时,显示C/C++堆栈
[root@guanzc-206 jar]# jstack -m 41262 >mstack [root@guanzc-206 jar]# vim mstack Attaching to process ID 41262, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 Deadlock Detection: No deadlocks found. ----------------- 41263 ----------------- 0x00007f9547e9ea35 __pthread_cond_wait + 0xc5 0x00007f9546f99037 _ZN7Monitor5IWaitEP6Threadl + 0xf7 0x00007f9546f99800 _ZN7Monitor4waitEblb + 0x100 0x00007f954712e621 _ZN7Threads10destroy_vmEv + 0x51 0x00007f9546d878e1 jni_DestroyJavaVM + 0x81 0x00007f9547c8463d JavaMain + 0x27d ----------------- 41265 ----------------- ...