传递参数vs内部函数的分配,java / android中的内存泄漏?

时间:2015-05-11 12:27:12

标签: java android memory-leaks

2做同样事情的不同方式(即从数据库中获取消息)

  • Scenerio 1

致电班级:

ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage(messages);

数据库类:

public ArrayList<String> getAllMessage(ArrayList<String> m) {
   m= /* get messages from DB */
   return m;
}
  • Scenerio 2

致电班级:

ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage();

数据库类:

public ArrayList<String> getAllMessage() {
   ArrayList<String> temp = new ArrayList<String>();
   temp = /* get messages from DB */
   return temp;
}

我的问题是,场景2

  1. temp ArrayList变量
  2. 会发生什么
  3. 在活动被销毁之前,它会留在内存中吗?
  4. 内存泄漏
  5. 修改

      

    在谈话视频 Android Application Architecture (Android Dev Summit 2015) 中,Adam Powell提到GC是您的敌人,并建议在Android应用的情况下使用场景1。

2 个答案:

答案 0 :(得分:2)

变量本身将超出范围并被释放(因为调用堆栈缩小)。

变量指向的对象(ArrayList)仍然有另一个指向它的引用,因此不会被收集。

当没有更多引用(例如您的messages变量或字段)存在时,它将会消失。

这不是内存泄漏。

在这两种情况下,在调用函数之前创建空ArrayList是没有意义的(并且你应该问自己一旦收到新函数会发生什么,就像你担心temp一样.Don&# 39;不用担心,它只是毫无意义,没有危险,或者是“泄漏”。#/ p>

请改为:

ArrayList<String> messages = Db.getAllMessages();

答案 1 :(得分:0)

这两种情况没有区别。

r.h.s.上的空数组列表在方案1中,立即有资格获得GC。

对场景2中数据库类创建的临时值的引用将传递回调用方。它是数据库方法的本地,因此引用超出范围,其引用计数减1。

两者都没有泄漏,除非调用类挂起从数据库类返回的引用太长时间。