[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10330] Re: GC の対象にな るのは?



(株)ネットジーンの村山です.

>   しかし、JDK1.4.1_02(デフォルト状態 & GCオン)でプロファイリング
> すると、wait()の時点ですべてのStringが回収された状態になります。
多分,wait()があるので,wait()に入る直前にバイトコードを解析
して,不要な参照をクリアしているのではないでしょうか.

wait()は下手をすると,wait()に入ったまま二度と動かない可能性
もありますよね.そうすると,wait()に入る前に持っている参照は
ずっとそのままということも起こりうる.しかも,その回収でき
ないインスタンスが非常に巨大だったりすると,プログラムは
正しいにも関わらず,性能の低下,必要以上のヒープの増大,最悪
ではメモリ不足で停止するということさえ考えられます.

で,それを避けるために,不要な参照はクリアしておくという
戦略はありうるでしょう.

もちろん,こういう解析はwait()が無い場合でも同様にできますが,
その場合はほっておいてもリターンの段階でフレームが破棄されるので,
よほど長いメソッドを除いて,解析する必要はほとんどないでしょう.

> ・変数のスコープはコンパイラにとっては意味あるけどJVMにとっては意味ない。
> ・ローカル変数はメソッド実行中は(スコープが外れても)参照が残っている
もしそうだとすると,ローカル変数のスコープが外れた後どころか,
スコープが外れる「前」にインスタンスを回収することも可能では
ないでしょうか.
#もちろん,本質的なゴミオブジェクトに限ります.

#ただ,ここまで来ると,さすがにメモリモデルの関係とかで
#問題が起こるケースというのも,あったりするのかな??
#多分ないとは思うのだが....