jmap是堆分析工具,下面讲讲如何运用。
// 打印jvm的堆状况,主要是年轻代和老年代信息
jmap -heap <pid>
如:
[root@st ~]# /usr/jdk64/jdk1.7.0_67/bin/jmap -heap 139020
Attaching to process ID 139020, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 715784192 (682.625MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 644218880 (614.375MB)
used = 71736616 (68.41336822509766MB)
free = 572482264 (545.9616317749023MB)
11.135441420158317% used
Eden Space:
capacity = 572653568 (546.125MB)
used = 66047192 (62.987510681152344MB)
free = 506606376 (483.13748931884766MB)
11.53353365642524% used
From Space:
capacity = 71565312 (68.25MB)
used = 5689424 (5.4258575439453125MB)
free = 65875888 (62.82414245605469MB)
7.949974423363095% used
To Space:
capacity = 71565312 (68.25MB)
used = 0 (0.0MB)
free = 71565312 (68.25MB)
0.0% used
concurrent mark-sweep generation:
capacity = 1431699456 (1365.375MB)
used = 1362189696 (1299.0853271484375MB)
free = 69509760 (66.2896728515625MB)
95.14494751613567% used
Perm Generation:
capacity = 75956224 (72.4375MB)
used = 45465520 (43.35929870605469MB)
free = 30490704 (29.078201293945312MB)
59.8575305691868% used
17502 interned Strings occupying 2027936 bytes.
// 上面的信息比较笼统,我们还可以打印出具体类及实例信息, 将有助于帮助我们分析堆里面到底有哪些类的实例等
jmap -histo[:live只处理存活对象] <pid>
如,
----------------------------------------------
1: 4799654 767633904 [B
2: 4524949 252724792 [Ljava.lang.Object;
3: 4771043 114505032 backtype.storm.messaging.TaskMessage
4: 4481022 107544528 java.util.ArrayList
5: 4467550 107221200 java.util.concurrent.LinkedBlockingQueue$Node
6: 72567 10646528 <constMethodKlass>
7: 72567 9300432 <methodKlass>
8: 7755 8458672 <constantPoolKlass>
9: 7755 6805200 <instanceKlassKlass>
10: 6826 4969984 <constantPoolCacheKlass>
11: 32399 3637176 [C
12: 4074 1903960 <methodDataKlass>
13: 8184 1056368 java.lang.Class
14: 65570 1049120 backtype.storm.utils.MutableObject
15: 10837 846800 [S
16: 32101 770424 java.lang.String
17: 17095 683800 clojure.lang.PersistentVector
// 除此之外,我们可以将堆信息dump成文件,通过其他工具如jhat, mat做进一步分析
// 打印jvm的堆状况,主要是年轻代和老年代信息
jmap -heap <pid>
如:
[root@st ~]# /usr/jdk64/jdk1.7.0_67/bin/jmap -heap 139020
Attaching to process ID 139020, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 715784192 (682.625MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 644218880 (614.375MB)
used = 71736616 (68.41336822509766MB)
free = 572482264 (545.9616317749023MB)
11.135441420158317% used
Eden Space:
capacity = 572653568 (546.125MB)
used = 66047192 (62.987510681152344MB)
free = 506606376 (483.13748931884766MB)
11.53353365642524% used
From Space:
capacity = 71565312 (68.25MB)
used = 5689424 (5.4258575439453125MB)
free = 65875888 (62.82414245605469MB)
7.949974423363095% used
To Space:
capacity = 71565312 (68.25MB)
used = 0 (0.0MB)
free = 71565312 (68.25MB)
0.0% used
concurrent mark-sweep generation:
capacity = 1431699456 (1365.375MB)
used = 1362189696 (1299.0853271484375MB)
free = 69509760 (66.2896728515625MB)
95.14494751613567% used
Perm Generation:
capacity = 75956224 (72.4375MB)
used = 45465520 (43.35929870605469MB)
free = 30490704 (29.078201293945312MB)
59.8575305691868% used
17502 interned Strings occupying 2027936 bytes.
// 上面的信息比较笼统,我们还可以打印出具体类及实例信息, 将有助于帮助我们分析堆里面到底有哪些类的实例等
jmap -histo[:live只处理存活对象] <pid>
如,
----------------------------------------------
1: 4799654 767633904 [B
2: 4524949 252724792 [Ljava.lang.Object;
3: 4771043 114505032 backtype.storm.messaging.TaskMessage
4: 4481022 107544528 java.util.ArrayList
5: 4467550 107221200 java.util.concurrent.LinkedBlockingQueue$Node
6: 72567 10646528 <constMethodKlass>
7: 72567 9300432 <methodKlass>
8: 7755 8458672 <constantPoolKlass>
9: 7755 6805200 <instanceKlassKlass>
10: 6826 4969984 <constantPoolCacheKlass>
11: 32399 3637176 [C
12: 4074 1903960 <methodDataKlass>
13: 8184 1056368 java.lang.Class
14: 65570 1049120 backtype.storm.utils.MutableObject
15: 10837 846800 [S
16: 32101 770424 java.lang.String
17: 17095 683800 clojure.lang.PersistentVector
// 除此之外,我们可以将堆信息dump成文件,通过其他工具如jhat, mat做进一步分析
jmap -dump:live,format=b,file=heap.bin <pid>
例如:
[root@st ~]#/usr/jdk64/jdk1.7.0_67/bin/jmap -dump:format=b,file=worker.bin 139020