GCを構成する処理の実行時間の内訳を調査し,動作のボトルネックを考察した.その結果,DalvikVM ではオブジェクト間に存在する参照を辿って各オブジェクトを探索し,到達したオブジェクトへマークを施す処理に時間を要していることが分かった.この要因を調査したところ,DalvikVM におけるオブジェクトの探索処理では過去にマーク済みのオブジェクトに対しても繰り返しマーク処理を施しており,この冗長なマーク処理がGC の大きなオーバヘッドになっていることが分かった. そこで,マーク済みのオブジェクトを専用の表に記憶しておき,オブジェクトの探索時にこれを参照することで,マーク済みのオブジェクトに対する冗長なマーク処理を省略する手法を提案する.これにより,GC実行時間の多くを占めるオブジェクトの探索処理を高速化し,GC の大幅な高速化を実現した.なお,マーク処理の省略によって得られる効果を高めるべく,本提案手法ではマーク済みのオブジェクトを記憶するために二つの専用表を組み合わせて利用する.過去にマークがなされたオブジェクトを,マーク処理が複数回実行されているかどうかに応じてこれら別々の専用表を用いて管理することで,冗長なマーク処理が頻発しているオブジェクトを優先的に管理し,それらのオブジェクトに対するマーク処理を省略することで,マーク処理の大幅な高速化を実現した. 提案手法の有効性を検証するため,これをgem5シミュレータに実装し,GCBench,AOBench,およびSPECjvm2008 を用いてシミュレーションによる評価を行った.その結果,既存のMark & Sweep と比較して,最大12.4%のGC実行サイクル数を削減できることを確認した.また,GC の代表的な改良アルゴリズムであるConcurrent GCは一部のベンチマークプログラムにおいてスループットや停止時間が悪化していた一方,提案手法ではそのような性能悪化を抑制できており,手法の有効性を確認した.
|