如果Application类变量指向一个活动类变量,那么在活动被销毁之后会有内存泄漏

时间:2017-09-03 20:14:02

标签: java android arraylist memory-leaks

在我的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;

1 个答案:

答案 0 :(得分:1)

  

当此活动被销毁时(用户按下后退按钮),所以我认为活动类ArrayList内存必须释放

在Java中 - 和其他使用垃圾收集的语言 - 最接近“发布”的是“没有更多的引用指向它”。

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

  

现在是否会出现内存泄漏?

没有办法让ArrayList<String>被垃圾收集,因为你总是会引用它。

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

  • 您无意无限期地持有参考
  • 您不断向列表中添加更多对象,因此您的内存使用量会无限增长

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