リストへの参照変数がないケース1の場合、参照のメカニズムは何ですか?
リストへの暗黙の参照があります。for
これは、強化されたものを次のように翻訳することで理解できます。
for(Iterator e = returnList().iterator(); e.hasNext(); ) {
Integer i = (Integer)e.Next();
System.out.println(i);
}
ここで、e
は のイテレータへの参照を持ちreturnList
、それ自体は への参照を持ちますreturnList
。したがって、制御がループ内にある間のみ真になる is rooted であるreturnList
限り、 is rooted です。コントロールが本体を離れると、コレクションの対象になるため、コレクションの対象になります。e
for
for
e
returnList
もちろん、これはすべて、
- の所有者は
returnList
、その戻り値への参照を維持していません。
- 同じリストが別の呼び出し元に返されておらず、その別の呼び出し元が同じリストへの参照を維持していません。
スタック フレームがポップされると、リストは GC されますか?
必ずしも。リファレントにルート化された参照がないことを JVM が判断できる場合、コレクションの対象となります。必ずしもすぐに収集されるわけではないことに注意してください。
ケース1でGCを高速化する方法。
for
コントロールがループを離れるよりも早く収集することはできません。制御がループを離れた後に収集される場合があります。for
JVMにこれを心配させてください。
手動でガベージ コレクションを試みることができることに注意してください。
System.gc();
ただし、これによりガベージ コレクションがトリガーされると、完全なガベージ コレクションになる可能性があるため、動作が悪化する可能性があることに注意してください。JVM はこの要求を無視できることに注意してください。ここで多くの CPU サイクルを浪費している可能性があります。メモリが無限のシステムでは、ガベージ コレクタを実行する必要がないことに注意してください。このようなシステムでは、ガベージ コレクターが要求に従う場合、ガベージ コレクターを要求すると、CPU サイクルが完全に無駄になる可能性があります。
JVM にガベージ コレクションを管理させます。そのためのアルゴリズムは高度に調整されています。