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

问题描述 投票:21回答:3

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

android performance memory-management memory-leaks
3个回答
17
投票

来自Nikita Salnikov-Tarnovski's blog

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

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

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

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

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

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

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


8
投票

From eclipse memory analyser docs

浅与保留堆

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

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

保留的X堆是保留的X组中所有对象的浅大小的总和,即由X保持活着的存储器。

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

一组主要对象的保留集,例如特定类的所有对象或由特定类加载器加载的所有类的所有对象,或者仅仅是一堆任意对象,是如果所有对象都被释放的对象集。领先的集合变得无法访问。保留集包括这些对象以及只能通过这些对象访问的所有其他对象。保留的大小是保留集中包含的所有对象的总堆大小。

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


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.