【发布时间】:2012-09-18 00:30:02
【问题描述】:
摘要选项卡上的 Jvisualvm 堆转储具有按保留大小检查最大对象的功能。
保留的真正含义是什么?对象树的大小如何计算并在此处显示?
如果我可以在这里看到对象(10M)和它的成员对象(5M),我应该如何计算堆影响。它们都占用了 10M 还是 15M 的堆?
为什么我看不到我们的外观巨大的应用程序对象?
谢谢。
【问题讨论】:
标签: java profiling heap-memory jvisualvm
摘要选项卡上的 Jvisualvm 堆转储具有按保留大小检查最大对象的功能。
保留的真正含义是什么?对象树的大小如何计算并在此处显示?
如果我可以在这里看到对象(10M)和它的成员对象(5M),我应该如何计算堆影响。它们都占用了 10M 还是 15M 的堆?
为什么我看不到我们的外观巨大的应用程序对象?
谢谢。
【问题讨论】:
标签: java profiling heap-memory jvisualvm
保留的真正含义是什么?
完整 gc 后会有多大。例如。 GC 后具有大量条目的 WeakHashMap 可能为空。
如何计算对象树的大小并在此处显示?
JVM 使用内部 API 确定这一点。
如果我可以在这里看到对象 (10M) 和它的成员对象 (5M),我应该如何计算堆影响。它们都占用了 10M 还是 15M 的堆?
总大小为 10 MB。如果这是您最大的问题,除非您的机器只有 100 MB,否则不要担心。 (在这种情况下我会升级它)
为什么我看不到我们的外观巨大的应用程序对象?
也许它们的内存没有你想象的那么大??例如它们的加载可能很昂贵,但这并不会使它们变得庞大。
顺便说一句:VisualVM 是一个不错的免费内存分析器,但它只对发现明显的问题有用。我会尝试使用像 YourKit 这样的商业分析器(您可以获得免费的评估许可证)进行比较。
【讨论】:
我认为 VisualVM 中“保留”的最佳定义是垃圾回收后剩余的内存量。
在某些情况下,它可能大于“大小”,因为它直接或间接引用其他对象(或集合)。
【讨论】:
如果我可以在这里看到对象 (10M) 和它的成员对象 (5M),我应该如何计算堆影响。它们都占用了 10M 还是 15M 的堆?
我认为它实际上占用了 15M 的堆,对象保留大小 10M 意味着,当这个对象(10M)被扫描时,10M 将是空闲的。成员 object(5M) 仍被其他对象引用,并且仍在堆中。成员对象的保留大小可以大于对象本身。
【讨论】: