Android的:什么是浅,保留堆之间的差异(Android: what is the differ

2019-08-01 03:26发布

我试图找出应用程序的内存泄漏MAT ,在这里list_object我发现了一些数值INT Shallow heapretained heap列。 什么是这些价值,以及如何知道哪里是内存泄漏。

Answer 1:

从尼基塔·萨尔尼科夫,Tarnovski的博客 :

浅堆很简单 - 它仅包含由对象本身所占用的堆。 有一些细微的差别如何计算的,但对于本文的范围内,我们保留原样。 请继续关注关于同一主题的未来职位。

保留的堆在许多方面更有趣。 只有很少是你在浅堆兴趣,在大多数情况下,您的实际问题都可以翻译成“如果我从记忆,多少内存,现在可以通过垃圾收集器被释放删除此对象”。

现在,当我们都还记得,所有的Java垃圾收集(GC)算法遵循这样的逻辑:

1)有哪些是由GC认为是“重要”的某些对象。 这些被称为GC根和(几乎)永远不会丢弃。 它们是,例如,当前正在执行从本地代码和类似的“全球”的对象方法的局部变量和输入参数,应用程序线程,引用。

2)从那些GC根引用的任何物体都假定为在使用中,因此无法通过GC丢弃。 一个对象可以在Java中不同的方式引用另一个,在最常见的情况一个对象存储在对象B.在这种情况下的领域,我们说“B引用A”。

3)重复这个过程,直到可以从GC根部传递地到达的所有对象访问并标记为“使用中”。

4)一切是未使用的,可以扔掉。



Answer 2:

从蚀存储器分析器文档

浅与保留堆

浅堆是由一个对象所消耗的存储器。 一个对象需要每参考32或64位(取决于操作系统体系结构),每整数4个字节,每长8个字节,等等。根据堆转储格式的尺寸可以被调整(例如对准8,等... )模型更好的虚拟机的实际消费。

保留设置 X的是一组这将通过GC去除当X是垃圾收集的对象的。

X的保留堆是浅尺寸的所有对象中的在所保留的集合X的总和,即,存储器保持活通过X.

一般来说,对象的浅堆是其在堆的尺寸和相同对象的留存大小是当对象是垃圾收集的将被释放的堆内存量。

为一家领先的一组对象,诸如特定类的所有对象或由特定的类加载器或简单地一堆任意对象的加载的所有类的所有对象的保留集合,是集如果所有对象被释放的对象的是领先的集变得不可访问。 保留的集包括这些对象,以及只能通过访问这些对象的所有其他对象。 所保持的尺寸是包含在所保留的集合中的所有对象的总的堆大小。

最小保持尺寸给出了计算方面比确切保留的一组物体的大小更快的保留尺寸的良好(下)估计。 这不仅取决于对象在检查组的数量,而不是在堆转储对象的数量。



Answer 3:

在简单的话对象的浅堆是其在堆大小和相同的对象的保留大小当对象是垃圾收集的将被释放的堆内存量。 更多细节



文章来源: Android: what is the differences between shallow and retained heap