摘要选项卡上的Jvisualvm堆转储具有按保留大小检查bigest对象的功能。
保留的真正含义是什么?如何计算和显示对象树的大小?
如果我可以在这里看到对象(10M)和它的成员对象(5M)我应该如何计算堆影响。它们都占用了10M或15M的堆吗?
为什么我看不到任何外观巨大的应用程序对象?
感谢。
答案 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中“保留”的最佳定义是垃圾收集后将保留的内存量。
在某些情况下,它可以大于“大小”,因为它直接或间接引用其他对象(或集合)。