【问题标题】:If Application class variable points to an activity class variable then after activity gets destroyed will there be a memory leak or not如果应用程序类变量指向一个活动类变量,那么在活动被销毁后是否会发生内存泄漏
【发布时间】:2017-09-03 20:14:01
【问题描述】:

在我的Application 类中,有一个 ArrayList,还有一个 Activity,在初始化这个 ArrayList 之后,我现在还创建了一个 ArrayList,我将 Application 类 ArrayList 引用到这个活动类 ArrayList。

现在我在想这个活动什么时候会得到destroyed(用户按下后退按钮),所以我认为必须释放活动类ArrayList内存,但是因为同样的内存也被App类ArrayList引用所以现在会不会有Memory Leak??

如果没有Memory Leak,那么请告诉我,当我将我的活动/片段上下文存储在静态变量中时,会发生Memory Leak,但为什么不在这里。

应用程序类代码

public class App extends MultiDexApplication {
     ArrayList<String> contacts;
}

活动类代码

ArrayList<String> arr = new ArrayList<String>();
arr.add("123");
((App) getApplication()).contacts = arr; // Here I am refrencing arr to contacts;

【问题讨论】:

    标签: java android arraylist memory-leaks


    【解决方案1】:

    当这个活动将被破坏(用户按下返回按钮),所以我认为活动类 ArrayList 内存必须被释放

    在 Java 和其他使用垃圾回收的语言中,最接近“已发布”的是“不再有指向它的引用”。

    在这种情况下,ArrayList 仍然有一个指向它的引用:Application 中的 contacts 字段。因此,ArrayList 不能被垃圾回收。

    现在会不会有内存泄漏?

    永远无法对 ArrayList&lt;String&gt; 进行垃圾收集,因为您将始终拥有对它的引用。

    但是,我们倾向于在内存使用不佳的情况下保留“泄漏”一词:

    • 您不打算无限期地保留引用
    • 您不断向列表中添加更多对象,因此您的内存使用量会无限增长

    这是否是“泄漏”完全取决于这是否是预期行为(例如,您使用此 ArrayList&lt;String&gt; 作为从应用程序外部(例如从磁盘或网络)获取的数据的缓存)。

    【讨论】:

    • 我正在使用这个数组列表来存储来自后端的数据,但是当活动被破坏时我仍然需要存储它,这就是为什么将它存储在我的应用程序中,现在会不会有内存泄漏?还请告诉我为什么当我将我的活动/片段上下文存储在静态变量中时会发生内存泄漏,但为什么不在这里。
    • @SudhanshuGaur:“现在会不会有内存泄漏?” ——我无法回答。这是否是“泄漏”完全取决于这是否是预期的行为。 “当我将我的活动/片段上下文存储在静态变量中时,就会发生内存泄漏”——活动和片段被框架破坏,之后它们就没有用了。持有对无用对象的引用是内存泄漏。我不能说你的ArrayList&lt;String&gt; 是不是没用。
    • @SudhanshuGaur 在您保存数据之前,它不是泄漏,因为您仍然需要它。一旦你保存了数据,你就不再需要它了,那么如果你不释放它就会泄漏。此时,您应该调用contacts.clear() 或将contacts 设置为null。现在请记住,一些字符串的无用 ArrayList 并不是一个可怕的泄漏,而坚持一个死的活动,是一个更大的浪费。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多