为什么 jmap -histo 的结果不同于 jmap -dump
why the result of jmap -histo is different from jmap -dump
最近我遇到了一个 gc 问题,我使用 jmap 来转储堆。但不幸的是它没有正常工作;
i 运行 jmap -histo 3916|more before dump , 结果是
num #instances #bytes class name
----------------------------------------------
1: 1784198 733117168 [C
2: 12210014 390720448 java.util.concurrent.ConcurrentHashMap$Node
3: 11908601 285806424 java.lang.Long
4: 11884602 285230448 java.lang.Double
5: 545 86335608 [Ljava.util.concurrent.ConcurrentHashMap$Node;
6: 12405 65677584 [I
7: 1735496 41651904 java.lang.String
然后我运行"jmap -dump:format=b,file=heap.bin 3916",然后我用eclipse MemoryAnalyzer分析heap.bin,生成了一个直方图如下
Class Name | Objects | Shallow Heap | Retained Heap
-----------------------------------------------------------------------------------------
java.util.concurrent.ConcurrentHashMap$Node | 12,207,879 | 390,652,128 |
java.lang.Long | 11,889,204 | 285,340,896 |
java.lang.Double | 11,884,164 | 285,219,936 |
java.util.concurrent.ConcurrentHashMap$Node[]| 347 | 86,311,832 |
char[] | 1,659,912 | 50,128,128 |
java.lang.String | 1,659,062 | 39,817,488 |
-----------------------------------------------------------------------------------------
分析了这两个结果,发现dump里面的对象都比histo少,而且
char[] 的对象要少得多,但为什么呢? 运行 "jmap -dump" 命令时 jmap 会触发次要 gc 吗?
除非您指定 :live
选项,否则 jmap
不会触发 GC。如果没有此选项,直方图将包含无法访问的对象。
但是,内存分析器在解析堆转储时默认 removes unreachable objects。虽然也可以使用 Memory Analyzer 计算无法访问的对象。
最近我遇到了一个 gc 问题,我使用 jmap 来转储堆。但不幸的是它没有正常工作;
i 运行 jmap -histo 3916|more before dump , 结果是
num #instances #bytes class name
----------------------------------------------
1: 1784198 733117168 [C
2: 12210014 390720448 java.util.concurrent.ConcurrentHashMap$Node
3: 11908601 285806424 java.lang.Long
4: 11884602 285230448 java.lang.Double
5: 545 86335608 [Ljava.util.concurrent.ConcurrentHashMap$Node;
6: 12405 65677584 [I
7: 1735496 41651904 java.lang.String
然后我运行"jmap -dump:format=b,file=heap.bin 3916",然后我用eclipse MemoryAnalyzer分析heap.bin,生成了一个直方图如下
Class Name | Objects | Shallow Heap | Retained Heap
-----------------------------------------------------------------------------------------
java.util.concurrent.ConcurrentHashMap$Node | 12,207,879 | 390,652,128 |
java.lang.Long | 11,889,204 | 285,340,896 |
java.lang.Double | 11,884,164 | 285,219,936 |
java.util.concurrent.ConcurrentHashMap$Node[]| 347 | 86,311,832 |
char[] | 1,659,912 | 50,128,128 |
java.lang.String | 1,659,062 | 39,817,488 |
-----------------------------------------------------------------------------------------
分析了这两个结果,发现dump里面的对象都比histo少,而且 char[] 的对象要少得多,但为什么呢? 运行 "jmap -dump" 命令时 jmap 会触发次要 gc 吗?
:live
选项,否则 jmap
不会触发 GC。如果没有此选项,直方图将包含无法访问的对象。
但是,内存分析器在解析堆转储时默认 removes unreachable objects。虽然也可以使用 Memory Analyzer 计算无法访问的对象。