为什么jmap -histo的结果与jmap -dump不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么jmap -histo的结果与jmap -dump不同相关的知识,希望对你有一定的参考价值。

最近我遇到了一个gc问题,我使用jmap来转储堆。但遗憾的是它没有正常工作;

我在转储之前运行jmap -histo 3916 | more,结果是

 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 |              
-----------------------------------------------------------------------------------------

分析了两个结果,我发现转储中的对象都比histo少,而char []的对象要少得多,但为什么呢?运行“jmap -dump”命令时jmap会触发次要的gc吗?

答案

除非您指定jmap选项,否则:live不会触发GC。如果没有此选项,直方图将包含无法访问的对象。

但是,Memory Analyzer在解析堆转储时默认使用removes unreachable objects。虽然也可以使用Memory Analyzer计算无法访问的对象。

以上是关于为什么jmap -histo的结果与jmap -dump不同的主要内容,如果未能解决你的问题,请参考以下文章

为什么块大小为128M?

dropout是什么?为什么dropout管用?测试集上是否需要使用dropout?说明为什么神经网络中的dropout可以作为正则化?

为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

jQuery Ajax,不执行,为啥呢。

C 语言为什么不会过时?