私はJava 8の 'closure'と少し混同しています。これは、値を超えていると思われます。 次のクラスを考えてみましょう。Java 8ラムダクロージャとGC
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'dすることができますか? "someObj"はdoSomething()のラムダが必要とするため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シーケンスは何ですか?
私が知る限り、JavaのGCは参照カウントとJavaのlambdaを使用して、インラインクラスの文法上の砂糖に過ぎません。長い話は短いです:これはインラインクラスでこれをすべて実装するかのように機能します。インラインクラスはプライベートクラスなので、いつでも周囲のオブジェクト(およびその属性とメソッド)にアクセスできます。参照カウントは残りの部分とオブジェクトの正しい解放(ラムダが実行された後)を処理します。 – Turing85
**これは確かに重複していますが、別の質問です。[Java8ラムダは、匿名クラスのようなその囲むインスタンスへの参照を保持していますか?](https://stackoverflow.com/a/28447015/581205)**参照https://stackoverflow.com/a/23991339/581205 – maaartinus