弱参照とラムダ式
突然ですがクイズです!
以下のコードを実行した時の出力は何になるでしょうか?
- truetrue
- falsefalse
- falsetrue
- truefalse
簡単にコードの解説をするとWeakReferenceは引数に渡しているインスタンスに強参照(普通にJava書いてるときの参照)をしているものが無くなるとGC対象になるよ!ってものです。a, bには匿名クラスとラムダ式を渡して、即GCしています。
回答
ラムダ式に強参照してるやつがいる・・・?どういうことだ???
解説
ラムダ式は匿名クラスに変換されるわけではなく、invokedynamic命令で実行されています。どうやらそのへんで違いが出ていそうです。 ラムダ式の実装を調べるとわかりそうです。
@nagise @orekyuu @wreulicke この辺ですかねhttps://t.co/QqpWyT5zMv
— 持田真哉 (@mike_neck) 2016年10月25日
メンションで教えてもらった資料を見ると39ページから答えが書いてあります。
ということでWeakReferenceに渡していたインスタンスはシングルトンになっていたためGCされなかったんですね。なるほど。
ところで外部の変数を使用していない場合はシングルトンになるという話でした。つまり外部の変数を使用するラムダ式なら結果は変わるのでしょうか?
@mike_neck @orekyuu @wreulicke 先の問題に加えて
— なぎせ ゆうき (@nagise) 2016年10月25日
int hoge = 123;
new WeakReference<>*1;
みたいにしたらnullになりましたよ。
問題の元ネタ
ちなみに、問題の元ネタは匿名クラスとラムダ式と時々弱参照をクイズ形式にしたものです。 何も知らずにこの問題にハマるとびっくりするよね!