Java 受本地类影响的参数生存期:可能的陷阱?

Java 受本地类影响的参数生存期:可能的陷阱?,java,arguments,inner-classes,Java,Arguments,Inner Classes,前几天,我关注的是代码中参数的生命周期,如下所示: void someMethod(最终ComplexObject arg1,ComplexObject arg2){ //…一些代码 //Runnable的新实例在另一个线程上执行 post(新的Runnable(){ @凌驾 public void run(){//注意:在run()中未引用arg2 // 1 //…这里有一些代码 arg1.doStuff(); // 2 //…这里有一些额外的代码 } // 3 }); } 考虑电话:

前几天,我关注的是代码中参数的生命周期,如下所示:

void someMethod(最终ComplexObject arg1,ComplexObject arg2){
//…一些代码
//Runnable的新实例在另一个线程上执行
post(新的Runnable(){
@凌驾
public void run(){//注意:在run()中未引用arg2
// 1
//…这里有一些代码
arg1.doStuff();
// 2
//…这里有一些额外的代码
}   // 3
});
}
考虑电话:

someMethod(新的ComplexObject(),//object1
新的ComplexObject());//反对意见2
我假设新创建的
object1
只能在使用
run
方法(第//3行)完成另一个线程时才能
GC

显然,
object2
在这种情况下不受影响

  • 有人能确认这些假设吗?还有
  • 当人们应该警惕
    object1
    的这种不可预测的生命周期延长造成“泄漏”的可能性时,是否存在实际情况(例如)?(如果
    ComplexObject
    是一个“重”内存对象,则这尤其不受欢迎)

  • 根据我的经验,很难纠正Java中存在混乱内存泄漏的代码。您是对的,GC在每个对象上保留一个引用计数器,并且在引用计数返回到0之前,该对象不适用于GC


    实际场景……奇怪的是,我想不出任何真正明显的例子,除了故意做一些可笑的事情,比如制作重对象的.clone(),并保留对它们的引用,除了引起泄漏之外,没有其他目的

    您是正确的,当您创建的
    Runnable()
    被GCed时,
    arg1
    也将被GCed,而不是在此之前,因为GC知道哪个对象持有对哪个对象的引用


    我不会称之为泄漏,因为当不需要的引用被保存在内存中时,就会发生泄漏,但这里您需要这些引用。

    事实上,在Java中,循环引用也会被识别和GCed。所以引用计数语句是不正确的。嗯,老实说,我也不认为这是一个好的答案。您可以相对容易地在android上发生内存泄漏,这就是发布代码的来源。@kiruwka您将内存不足与内存泄漏混淆。@NarendraPathai不,我不是:)。我对它们都有经验,并不是说这段代码本身就创建了memleak。我要的是一个可能会造成这种情况的场景。(可能会被某个坏掉的“执行人”是的,静态是有害的。你必须信任你正在使用的API。Java中的Executor永远不会产生泄漏。+1无论如何,感谢对arg1生存期的确认。我猜这是因为arg1被编译为匿名Rannabls的一个成员(字节码)所以他们按这个顺序死去是有道理的。