我有点困惑于java 8的“闭包”。据推测,它比价值更接近。考虑下一节课。
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();
}问题是,当异步助手仍在工作时,SomeClassWithLargeMemoryFootprint的实例可以被GC化吗?在我看来,"someObj“不能像doSomething()中的lambda所要求的那样被GC控制。那州其他地方呢?
另外,考虑以下变量,其中我们调用包含类的成员方法:
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
}
}现在怎么办?‘助手’如何知道如何执行"memberMethod"?它是否获得对SomeClassWithLargeMemoryFootprint实例的引用?GC序列是什么?
发布于 2017-10-31 20:32:34
当异步助手仍在工作时,SomeClassWithLargeMemoryFootprint的实例可以被GC化吗?
不是的。VoidRunner实例对其封闭的SomeClassWithLargeMemoryFootprint对象有很强的引用,异步任务执行器以某种方式引用了它本身。所以不可能是GCed。
那州其他地方呢?
状态的其余部分由SomeClassWithLargeMemoryFootprint实例引用,因此不能是GCed。
‘助手’如何知道如何执行"memberMethod“
在第一个示例中,它知道如何访问someObj(即this.someObj):它具有对其封闭的SomeClassWithLargeMemoryFootprint对象(即this)的引用。
https://stackoverflow.com/questions/47043967
复制相似问题