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

标签 java android memory-leaks

我是 Java 编程的新手,有很多 C++ 经验,而且我正在阅读有关引用如何导致 Android 应用程序内存泄漏的文章。 This explanation让我难过。在“第 2 课”中,它说:

The point is, the Activity doesn’t know that the lifespan of SomeObject will end when the instance of the Activity ends. If that object remains in memory, it will hold that Activity in memory as well [...].

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

最佳答案

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

public void onResume() {
    super.onResume();

    SomeObject object = new SomeObject();

    object.setSuccessListener(new EventListener<Boolean>() {
        public void onEvent(Boolean response) {
            Log.d(TAG_NAME, "Valid response? "+response);
        }
    });

    SomeObjectManager.getSingleton().addObject(object);
}
  • 明确说明这是在 Activity 的 onResume()。

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

  • 因此,SomeObject 具有对 Activity 的引用,因为它具有对实现 EventListener 的匿名类的引用。

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

For instance, in the example above: we’ve attached a reference to our Activity instance to some object, presumably persistent, and in a manager somewhere. The point is...

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

所以当你说:

As I see it (probably wrong; please correct me), when the activity ends, SomeObject is destroyed (assuming no other reference to it exists). The activity references SomeObject, not the other way round.

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

这有帮助吗?

关于java - 了解 Android 应用程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245859/

相关文章:

java - "commons-io-2.0.jar and commons-io-2.0-sources.jar"之间的区别

android - 每个类在 C 代码 (NDK) 中为自己创建静态字段

android - 什么是默认 ActionBar 标题字体大小?

Java 泛型运行时实例化

java - 取消设置变量和方法

java - 使用 JAXB 编码长原始类型

Android - 如果 View 不可见,则在 RecyclerViewAdapter 中添加 MapFragment 失败

javascript - new Date() 会导致 Node.js 中的内存泄漏吗?

java - 如何分析 .hprof 文件中的堆数据并使用它来减少内存泄漏?

javascript - 如何找出 Node 进程中的内存泄漏