了解 Android 应用程序中的内存泄漏

Dab*_*ler 5 java android memory-leaks

我对 Java 编程相当陌生,具有丰富的 C++ 经验,并且我正在阅读有关引用如何导致 Android 应用程序中内存泄漏的内容。这个解释把我难住了。在“第 2 课”中,它说:

\n\n
\n

关键是,Activity 并不知道 SomeObject 的生命周期将在 Activity 实例结束时结束。如果该对象保留在内存中,它也会将该 Activity 保留在内存中[...]。

\n
\n\n

正如我所见(可能是错误的;请纠正我),当活动结束时,它SomeObject会被销毁(假设不存在对其的其他引用)。活动引用SomeObject,而不是相反。我不明白为什么这里有任何内容被泄露,更不用说整个活动了。

\n

ajp*_*olt 2

这与他们为 EventListener 创建匿名类这一事实有关。

\n\n
public void onResume() {\n    super.onResume();\n\n    SomeObject object = new SomeObject();\n\n    object.setSuccessListener(new EventListener<Boolean>() {\n        public void onEvent(Boolean response) {\n            Log.d(TAG_NAME, "Valid response? "+response);\n        }\n    });\n\n    SomeObjectManager.getSingleton().addObject(object);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 它明确指出这是在 Activity 的 nonResume() 中完成的。

  • \n
  • 匿名类(以及非静态内部类)具有对其周围类的隐式引用。因此在这种情况下,EventListener 具有对 Activity 本身的引用。

  • \n
  • 因此,SomeObject 具有对 Activity 的引用,因为它具有对实现 EventListener 的 Anonymous 类的引用。

  • \n
\n\n

这是您在问题中引用的引用之前的文本:

\n\n
\n

例如,在上面的示例中:我们\xe2\x80\x99将对\n Activity 实例的引用附加到某个对象(大概是持久的),并在\n 管理器中的某个位置。重点是...

\n
\n\n

因此,SomeObjectManager 类在 Activity 被销毁时不会消失,它持有对 SomeObject 的引用,而 SomeObject 持有对 EventListener 的引用,而 EventListener 又引用 Activity。

\n\n

所以当你说:

\n\n
\n

正如我所见(可能是错误的;请纠正我),当活动结束时,SomeObject 被销毁(假设不存在对它的其他引用)。该活动引用 SomeObject,而不是相反。

\n
\n\n

该逻辑中的缺陷是 SomeObject 确实通过 EventListener 引用了该活动。

\n\n

这有帮助吗?

\n