传递参数与函数内部分配,java/android 中的内存泄漏?
Passing parameters vs Allocation inside function, memory-leak in java/android?
2 种不同的方式做同样的事情(即从数据库中获取消息)
- 场景 1
呼叫 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;
}
- 情景2
呼叫 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、
- temp ArrayList 变量会发生什么,
- 它会保留在内存中直到 activity 被销毁吗?
- 是否内存泄漏?
编辑:
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();
2 种不同的方式做同样的事情(即从数据库中获取消息)
- 场景 1
呼叫 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;
}
- 情景2
呼叫 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、
- temp ArrayList 变量会发生什么,
- 它会保留在内存中直到 activity 被销毁吗?
- 是否内存泄漏?
编辑:
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();