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

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

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

谢谢。

保留的真正含义是什么?

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

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

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

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

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

为什么我看不到我们的门面巨大的应用程序对象?

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

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

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

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