Android:浅堆和保留堆之间的区别是什么

Sat*_*yam 21 performance android memory-leaks memory-management

我试图找出app的内存泄漏MAT,在这里list_object 我发现了一些数值int Shallow heapretained heap列.这些价值是什么,以及如何知道内存泄漏的位置.

G M*_*esh 17

来自Nikita Salnikov-Tarnovski的博客:

浅堆很容易 - 它只包含对象本身占用的堆.如何计算它有一些细微差别,但对于本文的范围,我们保持原样.请继续关注同一主题的未来帖子.

保留堆在许多方面更有趣.您很少对浅堆感兴趣,在大多数情况下,您的实际问题可以转换为"如果我从内存中删除此对象,现在可以通过垃圾收集器释放多少内存".

现在,我们都记得,所有Java垃圾收集(GC)算法都遵循以下逻辑:

1)有些物体被GC认为是"重要的".这些被称为GC根,并且(几乎)从不丢弃.例如,它们当前正在执行方法的局部变量和输入参数,应用程序线程,来自本机代码的引用以及类似的"全局"对象.

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

3)重复该过程,直到访问可从GC根传递到的所有对象并标记为"使用中".

4)其他一切都未使用,可以扔掉.


bms*_*omp 8

来自eclipse内存分析器的文档

浅与保留堆

浅堆是一个对象消耗的内存.一个对象每个引用需要32位或64位(取决于OS体系结构),每个整数4个字节,每个长度8个字节等.根据堆转储格式,可以调整大小(例如,对齐到8等等... )更好地模拟VM的实际消耗.

保留的X集是当X被垃圾收集时将由GC移除的对象集.

保留的X 是保留的X集中所有对象的浅大小的总和,即由X保持活着的内存.

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

一组主要对象的保留集,例如特定类的所有对象或由特定类加载器或简单地一堆任意对象加载的所有类的所有对象,是如果所有对象都被释放的对象集.领先的集合变得无法访问.保留集包括这些对象以及只能通过这些对象访问的所有其他对象.保留的大小是保留集中包含的所有对象的总堆大小. 在此输入图像描述

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


vrn*_*mar 6

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