[Yarv-devel] GC Tech. on Script Lang.
MAEDA Atusi
maeda-yarv @ atusi.org
2004年 2月 6日 (金) 17:45:45 EST
shudo at computer.org writes:
> 富士通研の中村さんが、Java の HotSpot VM にスレッドローカルな
> ヒープを追加してほげほげ、という研究をしていたような。
> あれは GC とは関係してただろうか。
http://www.ipsj.or.jp/members/Trans/Jpn/03/2003/4413/article002.html
ですね。これはまさに、最初の世代のGCはスレッドローカルにやろうという話
です。
スレッドローカルなヒープとグローバルなヒープを用意して、他のスレッドか
ら参照されている可能性のあるものはグローバルヒープに置く。
先行研究(Domani 2002)では、
・グローバルヒープにあるオブジェクトと、ローカルヒープにあるが「グロー
バル」という印がついたオブジェクトをグローバルなオブジェクトと呼ぶ。
・ローカルヒープ内のオブジェクト(L)へのポインタをグローバルなオブジェ
クトに代入しようとする時に、ライトバリアで検出し、Lから到達できる全
てのオブジェクトに再帰的に「グローバル」という印をつける(これらは、
今後他のスレッドから到達可能になるので)。
・ローカルGCでは、グローバルという印がついたものは回収しない。
それ以外で、ローカルスタックから指されていないものはゴミ。
中村さんらの論文では、ライトバリアの処理を軽くするために、もっと保守的
に、
・ローカルなオブジェクトLへのポインタを一度でもヒープに書き込んだら、L
に「グローバル」の印をつける。
としています。ローカルGCで回収されるゴミは、
・ヒープから一度も参照されたことがなく、かつスレッドのスタックから現在
指されていないオブジェクト。
だけです。(その他、静的な解析や履歴情報を用いて、最初からグローバルヒー
プに割り付ける最適化も行なっています。)
ローカルGCは全部のスレッドを止めずに行なえるという利点はあるものの、
・保守的すぎて、あまり多くのゴミを回収できない。
・ローカルヒープが小さいと効果も小さいし、大きくするとスレッド数に関す
るスケーラビリティが悪化する。
という問題があると思います。
> HotSpot VM は、GC の際、全スレッド GC safe point で止めます。
> (全スレッドを止めないで済むような GC が実装されてたかどうかは、
> 覚えてないです。
> HotSpot VM のメモリ管理って、1.4.1 から 1.4.2 でけっこう変わったとか。)
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
とかが面白いです。いくつかのコレクタが使えるけど、どれも全部のスレッド
を止めるみたいです。
> code patching (*) して、止めてます。
>
> (*) IBM TRL の人 (というか石崎さん?) がこういう言葉を遣ってたのですが、
> 何て言うのが一番通りがいいでしょう?
さあ…こう言うのはカッコ良い言葉を思いついた人の勝ちですからね。今から
でも間に合うかも。
前田敦司
Yarv-devel メーリングリストの案内