Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测新AS探查器中的内存泄漏?_Java_Android_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 检测新AS探查器中的内存泄漏?

Java 检测新AS探查器中的内存泄漏?,java,android,memory-leaks,garbage-collection,Java,Android,Memory Leaks,Garbage Collection,因此,我试图对安卓系统中的内存泄漏问题了如指掌,我很难理解它是如何工作的。我理解内存泄漏背后的逻辑,但当我尝试在android studio 3.0 profiler中使用它时,它变得很奇怪 例如:我在oncreate中将活动分配给一个静态变量,并将其保留在那里,然后旋转设备3次。这应该会导致内存泄漏,但正如探查器所示 我不知道如何解释这一点,但 1)为什么只有一个活动实例有深度,而其他实例没有深度?经过一点实验,我发现如果实例有深度,就不能进行垃圾收集,还是我错了?而且,当我第一次启动GC时

因此,我试图对安卓系统中的内存泄漏问题了如指掌,我很难理解它是如何工作的。我理解内存泄漏背后的逻辑,但当我尝试在android studio 3.0 profiler中使用它时,它变得很奇怪

例如:我在oncreate中将活动分配给一个静态变量,并将其保留在那里,然后旋转设备3次。这应该会导致内存泄漏,但正如探查器所示

我不知道如何解释这一点,但

1)为什么只有一个活动实例有深度,而其他实例没有深度?经过一点实验,我发现如果实例有深度,就不能进行垃圾收集,还是我错了?而且,当我第一次启动GC时,没有任何变化,没有任何活动得到GC'd,只有在第二个GC 2其他活动消失之后


2)那么为什么第一次没有运气(与正常活动相同,没有泄漏),如果引用了一个静态变量,他们究竟是如何收集垃圾的?

a
static
字段一次只能指向一个对象。因此,如果您有类似于
静态活动foo
foo
指向一个
活动,而不是三个。如果将三个值赋给
foo
,它将只指向最后一个值。另外两个
Activity
实例可以被垃圾收集,如果没有其他引用的话。好的,我明白了。深度呢。如果没有深度的话,活动最终会被破坏,这是愚蠢的吗?我不确定那里发生了什么。过去,堆转储只转储具有实际引用的对象,因此任何未收集的垃圾都不会在转储中。也许他们改变了这一点。@Arnissaykh你能确认没有深度意味着它可以被GC探测到吗?我看到同一活动的多个实例在屏幕旋转后也没有深度。@Nathan是的,没有深度意味着它与根没有连接,可以是GC'd。A
static
字段一次只能指向一个对象。因此,如果您有类似于
静态活动foo
foo
指向一个
活动,而不是三个。如果将三个值赋给
foo
,它将只指向最后一个值。另外两个
Activity
实例可以被垃圾收集,如果没有其他引用的话。好的,我明白了。深度呢。如果没有深度的话,活动最终会被破坏,这是愚蠢的吗?我不确定那里发生了什么。过去,堆转储只转储具有实际引用的对象,因此任何未收集的垃圾都不会在转储中。也许他们改变了这一点。@Arnissaykh你能确认没有深度意味着它可以被GC探测到吗?在屏幕旋转之后,我看到同一活动的多个实例也没有深度。@Nathan是的,没有深度意味着它与根没有连接,并且可以被GC'd。