Heap histogram
The jmap command will help you get a heap histogram that shows the per-class statistics, including the total number of instances and the total number of bytes occupied by the instances of each class.
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Histogram
$ <JDK>/bin/jmap -histo:live <pid>
num #instances #bytes class name
--------------------------------------
1: 100000 41600000 [LMemLeak$LeakingClass;
2: 100000 2400000 MemLeak$LeakingClass
3: 12726 1337184 <constMethodKlass>
4: 12726 1021872 <methodKlass>
5: 694 915336 [Ljava.lang.Object;
6: 19443 781536 <symbolKlass>
7: 1177 591128 <constantPoolKlass>
8: 1177 456152 <instanceKlassKlass>
9: 1117 393744 <constantPoolCacheKlass>
10: 1360 246632 [B
11: 3799 238040 [C
12: 10042 160672 MemLeak$FinalizableObject
13: 1321 126816 java.lang.Class
14: 1740 98832 [S
15: 4004 96096 java.lang.String
< more .....>
Heap dump & analysishttp://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Analysis
You can use the jmap command to get a heap dump with this command line:
$ <JDK>/bin/jmap -dump:live,file=heap.dump.out,format=b <pid>
You can use the jhat command to do the heap analysis and determine which references are keeping the leak suspect alive:
$ <JDK>/bin/jhat heap.dump.out
This tool supports a number of queries including the following:
- Show all reference paths from the root set to a given object. This is particularly useful for finding memory leaks.
- Show the instance counts for all classes.
- Show the heap histogram including the instance counts and sizes for all classes.
- Show the finalizer summary.