Android:浅层和保留堆有什么区别?

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

Solutions Collecting From Web of "Android:浅层和保留堆有什么区别?"

来自Nikita Salnikov-Tarnovski的博客 :

浅堆很容易 – 它只包含对象本身占用的堆。 如何计算它有一些细微之处,但在本文的范围内,我们保留原样。 请继续关注同一主题的未来post。

保留的堆在许多方面更有趣。 很less有人对浅堆感兴趣,在大多数情况下,您的实际问题可以转换为“如果我从内存中删除这个对象,垃圾收集器现在可以释放多less内存”。

现在,我们都记得,所有的Java垃圾收集(GC)algorithm都遵循这个逻辑:

1)GC有一些被认为“重要”的对象。 这些被称为GC根,并(几乎)从不丢弃。 例如,它们正在执行方法的本地variables和input参数,应用程序线程,来自本地代码的引用以及类似的“全局”对象。

2)从GC根引用的任何对象都被假定为正在使用,因此不会被GC丢弃。 一个对象可以以不同的方式在Java中引用另一个对象,在最常见的情况下,对象A存储在对象B的字段中。在这种情况下,我们说“B引用A”。

3)重复该过程,直到从GC根传递到的所有对象都被访问并被标记为“正在使用”。

4)其他一切都没有用,可以扔掉。

从日食记忆分析仪文档

浅堆与保留堆

浅堆是一个对象消耗的内存。 一个对象需要每个引用32或64位(取决于操作系统架构),每个整数4个字节,每个长度8个字节等等。根据堆转储格式的大小可以调整(例如alignment到8等)。 )来更好地模拟虚拟机的实际消耗。

X的保留集合是X被垃圾收集时将被GC删除的对象集合。

X的保留堆是保留的X集合中所有对象的浅层大小的总和,即由X维持的存储器。

一般来说,一个对象的浅堆是它在堆中的大小,同一对象的保留大小是当对象被垃圾收集时将被释放的堆内存量。

对于领先的对象集(例如特定类的所有对象或由特定的类加载器加载的所有类的所有对象或简单地一堆任意对象)的保留集合是一组对象,如果领先的一套变得难以接近。 保留集包括这些对象以及所有其他只能通过这些对象访问的对象。 保留的大小是保留集中包含的所有对象的总堆大小。 在这里输入图像说明

最小保留大小给出了保留大小的良好(低)估计,其被计算的方式比一组对象的精确保留大小快。 它仅取决于被检查集合中的对象数量,而不取决于堆转储中的对象数量。

简单地说,一个对象的浅堆就是它在堆中的大小,同一个对象的保留大小就是当对象被垃圾收集时将被释放的堆内存的数量。 更多细节