繁体   English   中英

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

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

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. 这是记忆泄漏吗?

编辑:

在谈话视频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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM