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

Passing parameters vs Allocation inside function, memory-leak in java/android?

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

呼叫 Class:

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

数据库Class:

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

呼叫 Class:

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

数据库Class:

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

我的问题是,在场景 2

  1. temp ArrayList 变量会发生什么,
  2. 它会保留在内存中直到 activity 被销毁吗?
  3. 是否内存泄漏

编辑:

In the talk video Android Application Architecture (Android Dev Summit 2015), Adam Powell mentions that GC is your enemy and suggests to use Scenario 1 in case of Android app.

两种情况没有区别。

r.h.s 上的空数组列表。在场景 1 中立即符合 GC 条件。

场景 2 中数据库 class 创建的对临时对象的引用被传回给调用者。它是数据库方法的本地方法,因此引用超出范围并且其引用计数减少一个。

两者都不是泄漏,除非调用 class 挂在从数据库 class 返回的引用上太久。

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

变量指向的对象(ArrayList)还有另一个引用指向它,所以不会被收集。

当不再有引用(例如您的 messages 变量或字段)时,它将消失。

这不是内存泄漏。


在这两种情况下,在调用函数之前创建空的 ArrayList 是没有意义的(你应该问自己一旦收到新的 ArrayList 会发生什么,就像你担心 temp 一样。别担心,这只是毫无意义,没有危险或 "leaky").

改为这样做:

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