jVisualVM的内存检查器中“保留大小”是什么意思?

时间:2012-09-26 11:31:32

标签: java profiling heap jvisualvm

摘要选项卡上的Jvisualvm堆转储具有按保留大小检查bigest对象的功能。

保留的真正含义是什么?如何计算和显示对象树的大小?
如果我可以在这里看到对象(10M)和它的成员对象(5M)我应该如何计算堆影响。它们都占用了10M或15M的堆吗? 为什么我看不到任何外观巨大的应用程序对象?

感谢。

3 个答案:

答案 0 :(得分:8)

  

保留的真正含义是什么?

完整的gc后会有多大。例如。在GC之后,具有大量条目的WeakHashMap可能为空。

  

如何计算和显示对象树的大小?

JVM使用内部API确定这一点。

  

如果我可以在这里看到对象(10M)和它的成员对象(5M),我应该如何计算堆影响。他们俩都花了10M或15M的堆?

总计为10 MB。如果这是你最大的问题,除非你的机器只有几百MB,否则不用担心。 (在这种情况下,我会升级它)

  

为什么我看不到任何外观巨大的应用程序对象?

也许他们的记忆力不如你想象的那么大?例如加载它们可能很昂贵,但这并不会使它们变得庞大。

BTW:VisualVM是一个很好的免费内存分析器,但它只对查找明显的问题很有用。我会尝试像YourKit这样的商业分析器(您可以获得免费的eval许可证)进行比较。

答案 1 :(得分:0)

  

如果我在这里可以看到对象(10M)及其成员对象(5M),应该如何计算堆影响。他们俩都占用了10M或15M的堆吗?

我认为实际上占用了15M的堆,对象保留大小为10M意味着,当清除此对象(10M)时10M将是空闲的。成员对象(5M)仍被其他对象引用,并且仍在堆中。成员对象的保留大小可以大于对象本身。

答案 2 :(得分:0)

我认为VisualVM中“保留”的最佳定义是垃圾收集后将保留的内存量。

在某些情况下,它可以大于“大小”,因为它直接或间接引用其他对象(或集合)。