SSJSVM の GC
4.2 設計
4.2.3 マークフェーズ
本研究で扱うオブジェクトは,64bitのヘッダを保持している.オブジェクトのヘッダの 64bitのうち上位32bitでオブジェクトのサイズ,下位3bitでオブジェクトの型を表してい る.しかし,現在ではヘッダの64bit中4bit目から32bit目までは利用されていない.そこ で,本研究ではヘッダの下から5bit目をマークビットとし,このbitが0なのか1なのか を見て判断する.マークビットが0であればマークされていない死んでいるオブジェクトで あり,1であればマークされている生きているオブジェクトである.
マークフェーズでは,ルートから指されているオブジェクトと,そこから辿れる全てのオ ブジェクトに再帰的にマークをしていく.生きているオブジェクトを発見したら,そのオブ ジェクトのヘッダに生きている証のマークを付けるする.SSJSVMにおいて,ルートとな る場所を以下に示す.
• JavaScriptのグローバル変数
• JavaScriptのローカル変数
• C言語のグローバル変数
• C言語のローカル変数
• 関数呼び出しの返り値を格納するレジスタ
• 汎用レジスタ
• 文字列テーブル
ルートから指されたオブジェクトが見つかったら,そこから再帰的にオブジェクトを辿ら
なければならない.しかし,オブジェクトのデータ型によって,オブジェクトから辿る先が 異なってくる.そこで,以下では第 2章の表2.2で示したデータ型のそれぞれの辿り方を 示す.
OBJECT型
OBJECT型のオブジェクトは,ヘッダ以外に4つのプロパティを保持している.それは,
配列にどこまでデータが格納されているかを表す値,配列の限界の長さの値,ハッシュテー ブル,データを格納する配列の4種類である.このうちオブジェクトから辿る必要のあるプ ロパティはデータを格納する配列である.そして,配列に格納されているデータから指され ているオブジェクトを辿る.図4.4はOBJECT型オブジェクトの構造を示しており,prop プロパティで指された配列を探索する.この図では,headerがヘッダ,numberOfPropが 配列にどこまでデータが格納されているかを表す値,limitOfPropが配列の限界の長さ,
mapがハッシュテーブルを示している.
図4.4 OBJECT型オブジェクトの構造
4.2 設計
図4.5 STRING型,FLONUM型オブジェクトの構造
STRING型,FLONUM型
STRING型とFLONUM型の2つのオブジェクトは,それぞれ文字列と浮動小数点を保
持するだけのオブジェクトであるため,このオブジェクトから先に辿るオブジェクトは存在 しない.そのため,この2つの型のオブジェクトが見つかった場合はそこから先は辿らない.
図4.5はSTRING型,FLONUM型オブジェクトの構造を示している.図のように,ヘッ
ダと値を保存するプロパティの2つのプロパティで構成されているため,これ以上辿る配列 は存在しない.
ARRAY型
ARRAY型のオブジェクトは,他のデータ型のオブジェクトと違って,OBJECT型と共
通のプロパティの配列以外にも辿らなければならないフィールドがある.ARRAY型のオ ブジェクトは配列を扱う構造体であるため,配列の中身も辿らなければならない.プログ ラムから指されているARRAY型オブジェクトの構造を図 4.6に示す.ARRAY 型のオブ ジェクトはOBJECT型同様にpropプロパティで指された配列の以外にも,ARRAY型オ ブジェクトが表している配列本体であるbodyプロパティで指された配列も探索する必要が ある.
図4.6 ARRAY型オブジェクトの構造
その他の型
上記に上げたOBJECT型,STRING型,FLONUM型,ARRAY型の4つオブジェク ト以外のデータ型のオブジェクトについては,オブジェクトの辿り方はOBJECT型と同じ である.なぜなら4つのオブジェクト以外のデータ型は全てOBJECT型と同じデータ構造 を持っているため,そのOBJECT型のデータ構造から他のオブジェクトを辿れるためであ る.そのため,この4つの型以外の型は全てOBJECT型と同じ辿り方で再帰的にオブジェ クトを辿ることができる.
4.2.4 スイープフェーズ
本研究では,ヒープ領域上にあるオブジェクトとフリーリストに繋がれた空き領域は共に それぞれの領域のサイズを記憶しているヘッダを持っている.そのため,ヒープ領域の先頭 から,ヘッダに記憶されている領域サイズずつ移動することで全てのオブジェクトまたは空 き領域へアクセスすることができる.
スイープフェーズで行う動作を以下に示す.まず,ヒープ領域の一番端のオブジェクトか