【发布时间】:2017-11-01 04:32:34
【问题描述】:
我对 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”不能被 GC 处理,因为 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
}
}
现在呢? “助手”如何知道如何执行“memberMethod”?它是否获得了对 SomeClassWithLargeMemoryFootprint 实例的引用? GC 序列是什么?
【问题讨论】:
-
据我所知,Java 中的 GC 使用引用计数,而 Java 中的 lambda 只是内联类的一些语法糖。长话短说:它的工作原理就好像您将使用内联类来实现所有这些。由于内联类是私有类,因此您始终可以访问周围的对象(及其属性和方法)。引用计数负责其余部分和对象的正确释放(也就是在执行 lambda 之后)。
标签: java lambda garbage-collection