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

传递参数与函数内部分配,java/android内存泄漏?,java,android,memory-leaks,Java,Android,Memory Leaks,做同一件事的两种不同方法(即从数据库获取消息) 场景1 主叫班级: ArrayList<String> messages = new ArrayList<String>(); messages = Db.getAllMessage(messages); ArrayList<String> messages = new ArrayList<String>(); messages = Db.getAllMessage(); ArrayList

做同一件事的两种不同方法(即从数据库获取消息)

  • 场景1
主叫班级:

ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage(messages);
ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage();
ArrayList messages=new ArrayList();
messages=Db.getAllMessage(消息);
数据库类:

public ArrayList<String> getAllMessage(ArrayList<String> m) {
   m= /* get messages from DB */
   return m;
}
public ArrayList<String> getAllMessage() {
   ArrayList<String> temp = new ArrayList<String>();
   temp = /* get messages from DB */
   return temp;
}
public ArrayList getAllMessage(ArrayList m){
m=/*从数据库获取消息*/
返回m;
}
  • 场景2
主叫班级:

ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage(messages);
ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage();
ArrayList messages=new ArrayList();
messages=Db.getAllMessage();
数据库类:

public ArrayList<String> getAllMessage(ArrayList<String> m) {
   m= /* get messages from DB */
   return m;
}
public ArrayList<String> getAllMessage() {
   ArrayList<String> temp = new ArrayList<String>();
   temp = /* get messages from DB */
   return temp;
}
public ArrayList getAllMessage(){
ArrayList temp=新的ArrayList();
temp=/*从数据库获取消息*/
返回温度;
}
我的问题是,在场景2中

  • tempArrayList变量会发生什么情况
  • 在活动被销毁之前,它是否会保留在内存中
  • 是内存泄漏吗

  • 编辑: 在谈话视频中,Adam Powell提到GC是你的敌人,并建议在Android应用程序中使用场景1


    这两种情况没有什么不同

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

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


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

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

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

    当不再存在引用(例如
    消息
    变量或字段)时,它将消失

    这不是内存泄漏


    在这两种情况下,在调用函数之前创建空的ArrayList是毫无意义的(您应该问问自己,一旦收到新的ArrayList,它会发生什么情况,就像您担心
    temp
    。别担心,这只是毫无意义,不危险或“泄漏”)

    改为这样做:

    ArrayList<String> messages = Db.getAllMessages();
    
    ArrayList messages=Db.getAllMessages();
    
    定义“立即”。不是在方法返回和实际重新分配发生之前,对吗?GC在单独的线程上运行;你不知道它什么时候会运行。引用计数将随着方法框架从堆栈中弹出而更新。请更详细地解释一下这样做有什么害处?ArrayList消息=新建ArrayList();messages=Db.getAllMessage();危害在于您正在
    newarraylist()上花费资源(周期、内存)
    ,让
    消息
    指向它,在下一行中,您将
    消息
    指向其他地方。您首先创建的
    ArrayList
    不再被引用,而是被垃圾收集。它从未被使用过,并且对于第二个操作来说也不是必需的,因此您所花费的资源被浪费了。