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

2022-09-03 02:41:34

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

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

谢谢。


答案 1

保留的真正含义是什么?

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

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

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

如果我可以看到这里的对象(10M)和它的成员对象(5M),我应该如何计算堆影响。他们俩都拿走了1000万还是1500万堆?

总数为 10 MB。如果这是您最大的问题,请不要担心,除非您的机器只有几个100 MB。(在这种情况下,我会升级它)

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

也许它们在记忆中并不像你想象的那么大??例如,它们可能加载起来很昂贵,但这并不能使它们变得巨大。

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


答案 2

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

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


推荐