GCについて勘違いしている人が結構多い(かつのりの日記2)

とありますが、static変数はGCの対象になります。

これはstatic宣言に関わらず参照到達可能であれば、GCの対象とはなりません。非staticフィールドに対する参照到達の検証はインスタンスがキーとなりますが、staticフィールドに対する参照到達の検証は、

  • 実行中のスレッド
  • そのスレッドのカレントクラスローダ、暗黙的に使用されるクラスローダ
  • そのクラスローダによってロードされたクラス

というようにたどり着いたクラスがキーとなります。

Tomcatのようなウェブアプリケーションのリロードの仕組みなどで行われる、クラスローダを使い捨てる方式を実装すれば、static宣言されたフィールドでもGCの対象になります。これはクラスローダへの参照がなくなるため、クラス、クラスのstaticフィールドとたどり着く事が出来なくなり、参照到達できないとGCに判断されるためです。