GCについて勘違いしている人が結構多い(かつのりの日記2)
とありますが、static変数はGCの対象になります。
これはstatic宣言に関わらず参照到達可能であれば、GCの対象とはなりません。非staticフィールドに対する参照到達の検証はインスタンスがキーとなりますが、staticフィールドに対する参照到達の検証は、
- 実行中のスレッド
- そのスレッドのカレントクラスローダ、暗黙的に使用されるクラスローダ
- そのクラスローダによってロードされたクラス
というようにたどり着いたクラスがキーとなります。
Tomcatのようなウェブアプリケーションのリロードの仕組みなどで行われる、クラスローダを使い捨てる方式を実装すれば、static宣言されたフィールドでもGCの対象になります。これはクラスローダへの参照がなくなるため、クラス、クラスのstaticフィールドとたどり着く事が出来なくなり、参照到達できないとGCに判断されるためです。