我试图通过MAT
找出应用内存泄漏,在list_object
我发现了一些数值
int Shallow heap
和retained heap
列。这些价值是什么,以及如何知道内存泄漏的位置。
答案 0 :(得分:17)
来自Nikita Salnikov-Tarnovski's blog:
浅堆很容易 - 它只包含占用的堆 对象本身。如何计算它有一些细微差别,但是 对于本文的范围,我们保持原样。请继续关注未来 关于同一主题的帖子。
保留堆在很多方面都更有趣。很少见 你对浅堆感兴趣,大多数情况下你的实际问题 可以翻译为“如果我从内存中删除此对象,如何 垃圾收集器现在可以释放大量内存“。
现在,我们都记得,所有Java垃圾收集(GC)算法 遵循这个逻辑:
1)有些物体被GC认为是“重要的”。 这些被称为GC根,并且(几乎)从不丢弃。他们是, 例如,当前正在执行方法的局部变量和输入 参数,应用程序线程,本机代码和引用 类似的“全球”对象。
2)假设从这些GC根引用的任何对象都在使用中 因此不会被GC丢弃。一个对象可以引用另一个对象 Java中的不同方式,在最常见的情况下存储对象A. 在对象B的字段中。在这种情况下,我们说“B引用A”。
3)重复该过程,直到所有可以传递的对象为止 从GC根到达并被标记为“正在使用”。
4)其他所有东西都未使用,可以扔掉。
答案 1 :(得分:8)
From eclipse memory analyser docs
浅与保留堆
浅堆是一个对象占用的内存。一个对象需要32 或每个参考64位(取决于OS架构),4个字节 per Integer,每个Long 8个字节等。取决于堆转储格式 可以调整大小(例如,对齐到8等)以更好地建模 虚拟机的实际消耗。
X的保留集是GC将删除的对象集 当X被垃圾收集时。
X的保留堆是所有对象的浅层大小的总和 保留的X组,即X保持活着的记忆。
一般来说,对象的浅堆是它在堆中的大小 并保留同一对象的大小是堆内存量 当对象被垃圾收集时将被释放。
一组主要对象的保留集,例如所有对象 由a加载的所有类的特定类或所有对象 特定的类加载器或简单的一堆任意对象,是 如果该前导集的所有对象都释放的对象集 变得无法进入。保留集也包括这些对象 因为所有其他对象只能通过这些对象访问。该 保留大小是包含在中的所有对象的总堆大小 保留集。
最小保留尺寸给出了良好(不足)的估计 保留的大小,其计算方式比精确保留的大 一组对象的大小。它只取决于中的对象数量 检查集,而不是堆转储中的对象数。
答案 2 :(得分:4)
简单来说,对象的浅堆是它在堆中的大小,同一对象的保留大小是在对象被垃圾回收时将释放的堆内存量。 More Details