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

Android:浅堆和保留堆之间有什么区别,android,performance,memory-management,memory-leaks,Android,Performance,Memory Management,Memory Leaks,我试图通过MAT查找应用程序的内存泄漏,在list\u object中我找到了一些数值 int浅堆和保留堆列。这些值是多少,以及如何知道内存泄漏的位置。来源: 浅堆很容易——它只由 对象本身。如何计算它有一些细微差别,但是 对于本文的范围,我们保持原样。请继续关注未来 关于同一主题的帖子 保留堆在许多方面更有趣。只有极少数是这样 你对浅堆感兴趣,大多数情况下是你的实际问题 可以翻译为“如果我从内存中删除此对象,如何 垃圾收集器现在可以释放大量内存” 现在,我们都记得,所有Java垃圾收集(GC)

我试图通过
MAT
查找应用程序的内存泄漏,在
list\u object
中我找到了一些数值 int
浅堆
保留堆
列。这些值是多少,以及如何知道内存泄漏的位置。

来源:

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

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

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

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

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

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

4) 其他的东西都不用了,可以扔掉


简单地说,对象的浅堆是其在堆中的大小,同一对象的保留大小是当对象被垃圾收集时将释放的堆内存量。

浅堆与保留堆的比较

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

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

保留堆的X是该堆中所有对象的浅层大小之和 X的保留集,即X保持活动的内存

一般来说,对象的浅堆是其在堆中的大小 同一对象的保留大小是 将在垃圾收集对象时释放

前导对象集的保留集,例如 一个特定类或所有类的所有对象,由 特定的类装入器或只是一组任意对象,是 如果该前导集的所有对象 变得难以接近。保留集也包括这些对象 因为所有其他对象只能通过这些对象访问。这个 retained size是堆中包含的所有对象的总堆大小 保留集。

最小保留大小给出了对 保留大小,其计算速度比准确的保留大小快 一组对象的大小。它只取决于中对象的数量 检查集,而不是堆转储中的对象数


好奇的是,除了存储在字段中之外,一个对象引用另一个对象的另一种方式是什么?@marekdef不必在这里发问。试着对这个问题发表评论。