java8lambda闭包和gc

56lgkhnf  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(289)

这个问题在这里已经有答案了

匿名类总是维护对其封闭示例的引用吗(3个答案)
三年前关门了。
我对Java8的“闭包”有点困惑。它被认为与价值观密切相关。考虑下一节课。

public class SomeClassWithLargeMemoryFootprint {
     //some state
     private SomeObject someObj;
     //some more state

     public void doSomething(SomeAsyncHelper helper) {
         helper.doAsync( () -> {
                             //some super slow operation
                             int foo = someObj.whatever();
                             //some more stuff    
                       });
     }
}

.

//Let's assume SomeAsyncHelper.doAsync takes a VoidRunner that looks like below
interface VoidRunner {
    void apply();
}

问题是,当async helper仍在工作时,someclasswithlargememoryfootprint的示例能否被gc'd?我很清楚,“someobj”不能是gc'd,因为它是dosomething()中lambda所要求的。其他州呢?
另外,请考虑以下变量,其中我们调用包含类的成员方法:

public class SomeClassWithLargeMemoryFootprint {
     //some state
     private SomeObject someObj;
     //some more state

     public void doSomething(SomeAsyncHelper helper) {
         helper.doAsync( () -> {
                //do something
                memberMethod();
                //do something else
                });
     }

     private void memberMethod() {
         //do something
     }

}

现在怎么办?“helper”如何知道如何执行“membermethod”?它是否获得对某个具有较大内存足迹的类的示例的引用?gc序列是什么?

yjghlzjz

yjghlzjz1#

当异步助手仍在工作时,是否可以gc'd someclasswithlargememoryfootprint的示例?
不是。voidrunner示例对其封闭的someclasswithlargememoryfootprint对象有一个强引用,并且它本身以某种方式被异步任务执行器引用。所以不能是gced。
其他州呢?
状态的其余部分由someclasswithlargememoryfootprint的示例引用,因此不能对其进行gced。
“助手”如何知道如何执行“membermethod”
就像它知道如何访问 someObj (即。 this.someObj )在第一个示例中:它有一个对其封闭someclasswithlargememoryfootprint对象(即。 this ).

相关问题