ネタ元はコチラ。
http://www.atmarkit.co.jp/fjava/rensai4/troublehacks05/troublehacks05_2.html
引用すると、
■ static変数に巨大なオブジェクトを格納していないか?
static変数はアプリケーションが終了するまで利用されると見なされるため、GCの対象外となる。
例えば、static宣言されたHashMapやArrayListなどが存在し、それに格納されたオブジェクトが不要になっても後始末されていない場合、OutOfMemoryErrorを引き起こすといったことが考えられる。
static宣言が本当に必要な変数であるかを確認し、static宣言が必要であれば、参照されるオブジェクトに不要なものが残らないように管理すべきであろう。
とありますが、static変数はGCの対象になります。
これはstatic宣言に関わらず参照到達可能であれば、GCの対象とはなりません。非staticフィールドに対する参照到達の検証はインスタンスがキーとなりますが、staticフィールドに対する参照到達の検証は、
- 実行中のスレッド
- そのスレッドのカレントクラスローダ、暗黙的に使用されるクラスローダ
- そのクラスローダによってロードされたクラス
というようにたどり着いたクラスがキーとなります。
Tomcatのようなウェブアプリケーションのリロードの仕組みなどで行われる、クラスローダを使い捨てる方式を実装すれば、static宣言されたフィールドでもGCの対象になります。これはクラスローダへの参照がなくなるため、クラス、クラスのstaticフィールドとたどり着く事が出来なくなり、参照到達できないとGCに判断されるためです。
ためしにサーブレットを作ってリロードしてみればわかると思います。
初心者向けの記事ではないので、正しいことを伝えて欲しいなと思います。一応@ITのサポート経由で筆者には伝わっているはずなので、早く修正して欲しいですね。
そういや、新人時代こんな事がありました。
自分「これこれは、こんな仕組みになってますよ。」
先輩「お前何ウソ言ってるのwww?」
自分「いやこれこれは、こうなんですって。」
先輩「このサイトにはこう書いてあるだろう。お前が間違っているんじゃないの?」
自分「いや、そのサイトは間違っていますよ。自分でコードまで調べたんですから。」
先輩「新人のくせに、そこまでわかるわけないだろ。そもそもサイトに間違いのせるわけないだろ」
自分「・・・(はぁ~、この人と一緒に仕事できない)」
という感じなことがありました。そのサイトっていうのは@ITだったかIT Proだったか忘れましたが、大手IT情報サイト。信頼性の有無に関わらずに、その辺のサイトを盲目的に信仰する人が多いのですよね。