[英]Is following scenario called memory-leak in java? Is it not Garbage Collected?
[英]Passing parameters vs Allocation inside function, memory-leak in java/android?
2做同样事情的不同方式(即从数据库中获取消息)
通话类:
ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage(messages);
数据库类:
public ArrayList<String> getAllMessage(ArrayList<String> m) {
m= /* get messages from DB */
return m;
}
通话类:
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中 ,
在谈话视频Android应用程序架构(Android Dev Summit 2015)中 ,Adam Powell提到GC是你的敌人,并建议在Android应用程序的情况下使用场景1。
变量本身将超出范围并被释放(随着调用堆栈缩小)。
变量指向的对象(ArrayList)仍然有另一个指向它的引用,因此不会被收集。
当不再存在引用(例如您的messages
变量或字段)时,它将消失。
这不是内存泄漏。
在这两种情况下,在调用函数之前创建空ArrayList是没有意义的(并且你应该问自己一旦收到新函数会发生什么,就像你担心temp
。不要担心,它只是毫无意义,没有危险或“漏水”)。
改为:
ArrayList<String> messages = Db.getAllMessages();
这两种情况没有什么不同。
方案1中rhs上的空数组列表立即符合GC的条件。
方案2中由数据库类创建的临时引用将传递回调用方。 它是数据库方法的本地,因此引用超出范围,其引用计数减1。
除非调用类挂起从数据库类返回的引用太长时间,否则它们都不是泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.