这个问题在这里已经有答案了:
匿名类总是维护对其封闭示例的引用吗(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序列是什么?
1条答案
按热度按时间yjghlzjz1#
当异步助手仍在工作时,是否可以gc'd someclasswithlargememoryfootprint的示例?
不是。voidrunner示例对其封闭的someclasswithlargememoryfootprint对象有一个强引用,并且它本身以某种方式被异步任务执行器引用。所以不能是gced。
其他州呢?
状态的其余部分由someclasswithlargememoryfootprint的示例引用,因此不能对其进行gced。
“助手”如何知道如何执行“membermethod”
就像它知道如何访问
someObj
(即。this.someObj
)在第一个示例中:它有一个对其封闭someclasswithlargememoryfootprint对象(即。this
).