[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 メーリングリストの案内