Android:浅堆和保留堆有啥区别

Posted

技术标签:

【中文标题】Android:浅堆和保留堆有啥区别【英文标题】:Android: what is the differences between shallow and retained heapAndroid:浅堆和保留堆有什么区别 【发布时间】:2012-09-24 07:50:25 【问题描述】:

我试图通过MAT 找出应用程序的内存泄漏,在list_object 中我找到了一些数值 int Shallow heapretained heap 列。这些值是多少,如何知道内存泄漏在哪里。

【问题讨论】:

【参考方案1】:

来自Nikita Salnikov-Tarnovski's blog:

浅堆很简单——它只包含被 对象本身。如何计算它有一些细微差别,但是 对于本文的范围,我们保持原样。敬请期待未来 同一主题的帖子。

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

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

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

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

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

4) 其他所有东西都没有使用,可以扔掉。

【讨论】:

好奇对象可以引用另一个对象而不是存储在字段中的另一种方式是什么? @marekdef 不要在这里问。尝试评论original author's blog。【参考方案2】:

From eclipse memory analyser docs

浅堆与保留堆

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

Retained set of X 是被 GC 移除的对象集合 当 X 被垃圾回收时。

Retained heap 是 X 中所有对象的浅层大小的总和 保留 X 的集合,即 X 保持活动的内存。

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

前导对象集的保留集,例如所有对象 一个特定的类或由一个加载的所有类的所有对象 特定的类加载器或只是一堆任意对象,是 如果该领先集合的所有对象都被释放的对象集合 变得无法访问。保留集也包括这些对象 因为所有其他对象只能通过这些对象访问。这 保留大小是包含在其中的所有对象的总堆大小 保留集。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Android:浅堆和保留堆有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

c和c ++中的动态内存分配和堆有啥区别

堆和红黑树有啥区别?

android:height 和 android:layout_height 有啥区别?

Android - 这三个 xml 文件有啥区别?

android:gravity 和 android:layout_gravity 有啥区别 [重复]

Android - 前台和后台服务有啥区别?