Series)の項目22で言及されているように、原則として内部クラスはstaticにすることが推奨されます。主な理由は、staticでない内部クラスが暗黙的にエンクロージングクラス(トップレベルクラス)のインスタンスを参照するためです。staticな内部クラスを持つクラスのヒープダンプstaticな内部クラスはエンクロージングクラスのインスタンスへの参照を持ちません。{}}非staticな内部クラスを持つクラスのヒープダンプ一方、staticな内部クラスはエンクロージングクラスのインスタンスへの暗黙的な参照を持ちます。{}}staticな内部クラスを原則とする理由staticな内部クラスは暗黙的な参照によってエンクロージングクラスのインスタンスフィールドを参照できるようになり、Iteratorやサブリストといった「複数のメンバーを共有すべき内部クラス」を容易に表現できます。プリミティブ型フィールドの共有に便利です。暗黙的な参照はヒープを若干占有するだけでなく、意外な形でガベージコレクションを妨げます。int)が返すListがstaticでない内部クラスである場合、何者かがサブリストを参照している間は元となるListはGC対象になりません。サブリストが元となるListを暗黙的に参照するためです。このように非staticな内部クラスは複雑でコード上に現れない参照関係を生みだし、システムの保守を難しくする可能性があります。内部クラスがエンクロージングクラスのインスタンスフィールドを参照する必要がある場合でも、まずはCopyOnWriteArrayListのIteratorのようにコンストラクタやメソッドによってそれを受け渡す設計を検証すべきです。検証コード暗黙的な参照がGCを妨げることを簡単に見るための検証コードです。本来System.gc()をプログラム内で利用すべきではありませんが、ここでは検証用と割り切って使っています。