JP2004287870A - ごみ集め方法及びコンパイル方法 - Google Patents
ごみ集め方法及びコンパイル方法 Download PDFInfo
- Publication number
- JP2004287870A JP2004287870A JP2003079341A JP2003079341A JP2004287870A JP 2004287870 A JP2004287870 A JP 2004287870A JP 2003079341 A JP2003079341 A JP 2003079341A JP 2003079341 A JP2003079341 A JP 2003079341A JP 2004287870 A JP2004287870 A JP 2004287870A
- Authority
- JP
- Japan
- Prior art keywords
- data structure
- state
- thread
- code
- garbage collection
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【課題】古典的トレース式ごみ集めでは、実行にあたって全スレッドを停止するが、多数のスレッドを使うサーバアプリケーションでは全スレッドを停止しようとすると長い時間がかかり、その間システムのサービスが停止してしまう。
【解決手段】プログラムの実行中に、データ構造を参照しうるスレッドが割付けたスレッドのみかという情報を管理しておく。そして、あるスレッドが単独でごみ集めの実行するときに、スレッド固有のルート集合(実行時スタック)からトレースできず、かつ、該スレッドのみが参照しうるデータ構造を求め、これを空き領域にすることで、スレッドが単独で自身の割付用メモリ空間をごみ集めすることを可能にする。これにより、スレッドが単独でごみ集めを実施する場合には他のスレッドを止める必要がなくなる。
【選択図】 図6
【解決手段】プログラムの実行中に、データ構造を参照しうるスレッドが割付けたスレッドのみかという情報を管理しておく。そして、あるスレッドが単独でごみ集めの実行するときに、スレッド固有のルート集合(実行時スタック)からトレースできず、かつ、該スレッドのみが参照しうるデータ構造を求め、これを空き領域にすることで、スレッドが単独で自身の割付用メモリ空間をごみ集めすることを可能にする。これにより、スレッドが単独でごみ集めを実施する場合には他のスレッドを止める必要がなくなる。
【選択図】 図6
Description
【0001】
【発明の属する技術分野】
本発明は、プログラムの実行系およびプログラミング言語の処理系の技術に関する。特に、ごみ集めによって自動的にメモリ管理をおこなうプログラミング言語およびその実行形式に関する。
【0002】
【従来の技術】
使い終わったメモリ空間を自動的に検出して空き空間に還元し、再利用できるようにするメモリ管理技法にごみ集めがある。ごみ集めには様々な実施方法があるが、トレース式のごみ集めの実施手順を次に示す。まず、実行時に空きメモリを使い果たしたら、ルート集合と呼ぶ、実行時スタックや大域変数などプログラムが参照可能であることが自明なデータ領域中にある参照の集合を求め、該集合からデータ構造を再帰的に辿る。この過程が終了した時点で辿ることがなかったデータ構造を使っていないデータ構造であるとみなし、使っていないデータ構造が占有している領域を空き領域に還元する(例えば非特許文献1参照)。
【0003】
【非特許文献1】Richard Jones and Rafael Lins、 ”Garbage Collection、” John Wiley & Sons、1996
【0004】
【発明が解決しようとする課題】
複数のスレッドが動作する環境下でごみ集めを実施する際に、たとえばごみ集めを実施するきっかけとなったスレッド以外の全てのスレッドが停止される等、スレッド間の同期をとるためのオーバヘッド処理が生じる。サーバなど数多くのスレッドを駆動する環境では、スレッド間の同期をとるためのオーバヘッドの影響が一層大きくなり、システムが長期間に渡って停止することがある。本発明の目的は、ごみ集めの際にスレッド間の同期をとる回数を減らし、システムが長期間に渡って停止する頻度を少なくすることにある。
【0005】
【課題を解決するための手段】
上記目的を達成するために、スレッドに、固有にデータ構造を割り付ける領域を与え、スレッドが該領域中の空き空間を使い果たした場合に、該スレッド単独で、該領域のごみ集めを実施することにより、スレッド間の同期を減らし、システムが長期間停止することを防ぐ。
【0006】
また、スレッド固有の領域のごみ集めはスレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることにより、ごみ集め時の処理を更に軽くする。
【0007】
更に、スレッド毎のごみ集めとヒープ領域全体のごみ集めを選択して実施することで、領域全体のごみ集めも行い、空き領域を十分確保することを可能にする。
【0008】
より詳細には、まず、スレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものを把握する。具体的には、データ構造に対し、割付けたスレッドのみが参照する可能性がある状態Lと、そうでない状態Sを用意する。大域変数など、スレッド間で共有するデータ構造は状態Sである。データ構造は、割付け時点では割付け元のスレッドのみから参照可能であり、したがってスレッドは割付け時点でデータ構造に状態Lを与える。スレッドは、参照を状態Sのデータ構造にストアするにあたり、ストアに先だって、参照先のデータ構造を含め、参照を再帰的にたどって到達しうるデータ構造群が他スレッドから可視になるとみなし、前記データ構造群の状態をSにする。次に、スレッド固有の割付け領域を使い果たしたとき、該スレッド固有のルート集合から状態がLのデータ構造のみを再帰的にたどって到達できない、状態がLのデータ構造の集合を求める。該集合に属するデータ構造は、参照する可能性があるスレッドが自身を割付けたスレッドのみであり、なおかつ、自身を割付けたスレッドに固有のルート集合から到達できないので、使い終わったとみなして解放できる。本ごみ集めでは、参照をデータ構造にストアするに先立ち、ストア先のデータ構造が状態Sか検査し、真ならば参照を再帰的にたどって到達しうる状態Lのデータ構造群の状態をSに変更する。
【0009】
本明細書では、更に上述した検査や状態の変更のオーバヘッドを軽減するためにコンパイラによる最適化時に新しい処理を行う発明も開示する。
【0010】
まず最適化でデータ構造を割付けた時点での初期状態を最適化し、状態の変更が発生する確率を抑える発明である。具体的には、割付けを実施する個々の文について、該文が割付けるデータ構造が状態Lから状態Sに遷移する可能性が高いか調べ、可能性が高いならば、該割付け文のコードとして、最初から状態Sの状態でデータ構造を割付けるコードを出力する。ある割付け文が生成するデータ構造の状態が遷移する確率が高いか否かは、プロファイル情報やフロー解析によって判断できる。
【0011】
最適化により参照を書きこむコードを高速化する発明も開示する。参照を書き込むコードは、書きこみ先のデータ構造の状態がSか検査するコード、検査結果が真である場合に参照を再帰的にたどって到達しうる状態Lのデータ構造の状態をSに変更するコード、参照を書き込むコードという3種類のコードからなるが、前記3種類のコードのうち前2者から生じるオーバヘッドを抑止する。まず、フロー解析によって書きこむ参照が指示するデータ構造の状態νおよび書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、前記状態νが必ずSであると判った場合、あるいは前記状態ιが必ずLであると判った場合には、遷移が不要であり、書きこみ先のデータ構造の状態を検査するコードおよび書きこむ参照を再帰的にたどって状態を遷移させるコードの全体を省略する。この最適化で前記検査および遷移のコードを省略できなかった場合には、前記検査のコードの省略を試みる。具体的には、書きこむ参照が指示するデータ構造書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、状態ιが必ずSであると判明した場合には、前記検査のコードを省略できる。
【0012】
【発明の実施の形態】
以下本発明の実施例を図面を用いて詳細に説明する。なお、本発明はこの実施例に限定されなるものではない。
【0013】
本実施例の言語処理系のプログラムは図1に示すような計算機上で動作する。計算機はプロセッサ101と主記憶102、バス103、ディスク装置104、CD−ROMドライブ105を有する。ごみ集めを実施するプログラムや、コンパイラなどの言語処理系のプログラムはディスク装置104に保持される。プロセッサ101は、ディスク装置104から言語処理系のプログラムなどを、バス103を介して主記憶102にとりこんで実行する。上述したプログラムは記録媒体、たとえばCD−ROM106からCD−ROMドライブ105を介してディスク装置104にとりこまれる。計算機にネットワークコントローラを持たせ、ネットワークを介してとりこむようにしてもよい。
【0014】
図2に、ごみ集め201および最適化を実施する最適化系202を含む言語処理系の例を示す。図2の言語処理系では、次の手順でソースファイル203を実行形式プログラム204に変換する。まず、ソースファイル203をコンパイラ205でオブジェクトファイル206に変換する。変換の過程で、最適化系202により、最適化を実施する。最適化系は本実施例の特徴部分であるが詳細は後述する。次に、リンカ207により、オブジェクトファイル206と実行時ライブラリ208をリンクして実行形式プログラム204を得る。ごみ集め201は実行時ライブラリ208の一部としてオブジェクトファイルとリンクされる。ごみ集め201も本実施例の特徴部分であり詳細を後述する。コンパイラ205はプロファイル情報を生成するコードをオブジェクトコード中に挿入することも可能であり、プロファイル情報を生成するコードを含む実行形式プログラム204を実行するとプロファイル情報209が得られる。プロファイル情報209はソースファイル203を再度コンパイルする際の最適化処理時などに利用する。
【0015】
図3に、プロファイル情報209が含む情報のうち、本実施例での特徴的な最適化処理に利用される情報の例を示す。図3に示す情報は割付け文の固有の番号301と、該割付け文で割付けを実施した回数302、該割付け文で割付けたデータ構造のうち、状態がLからSに変化したものの数303、割付け文の位置を表す情報304を記録している。ここで、状態Lとはデータ構造に対し、割付けたスレッドのみが参照する可能性がある状態のことであり、状態Sはそうでない状態のことをいう。大域変数など、スレッド間で共有するデータ構造は状態Sである。データ構造の「状態」の値によりスレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものが把握される。
【0016】
このプロファイル情報は、コンパイル時に個々の割付け文に固有の番号301を割り振り、それに対応する割付け文の位置304を記録しておき、次に、割付け回数302を得るために、個々の割付け文に割付けた回数を記録するためのコードを織り込んでおくことにより得られる。
【0017】
図4に、プロファイル情報を得るための割付け文(メモリ割付を実行するコード)の例を示す。処理401がプロファイル情報を取得するために挿入したコードであり、プロファイル情報の取得をおこなわない実行形式プログラム204を生成するときには、処理401を省略できる。図4に示すコードは、次の手順で割付けを実施する。まず、判断402で空き領域があるか確認し、あれば処理403に進んで空き領域を確保し、なければ処理404に進んでごみ集めを実施し、空き領域を確保した上で処理403に進む。処理403で空き領域を確保したら、処理401に進み、該割付け文で割付けを実施した回数302に1を加算し、また、割付けたデータ構造の先頭(ヘッダ)部分に状態遷移回数303を取得するために必要な情報、つまり該割付け文に固有な番号301を書き込む。
【0018】
図5に割付け文により割り付けられるデータ構造の例を示す。データ構造のヘッダ部分には、割付け文に固有な番号を記録するフィールド501と、データ構造を参照しうるスレッドが割付け元のスレッドのみか否の状態を記録するフィールド502、ごみ集めのときに、実行時スタックなど、ルート集合から参照を再帰的にたどって到達できるか否かを記録するためのフィールド503がある。
【0019】
図4に戻り、処理401でプロファイルに関する処理を実施したら、処理405に進み、割付けたデータ構造の状態フィールド502を初期化し、値Lを書き込む。本実施例では値Lを1、値Sを0とする。続いて処理406に進んでマークフィールド503に「到達できていない」ことを意味する値0を書き込む。最後に処理407で割付け文を実施した結果として、割付けたデータ構造のアドレスを返戻する。
【0020】
図6に、処理404で実施するごみ集めの例を示す。図6の処理601および処理602において、本実施例の特徴的なごみ集めを実施している。図6に示すごみ集め処理では、まず判断603で、空き領域が足らなくなったスレッドが単独で自身の割付け領域(図7の領域704)のみを対象にごみ集めを実施するか、それともヒープ領域全域を対象に、全スレッドを止める従来技術のごみ集め604を実施するかを決める。スレッド固有の割付領域のみのごみ集めではスレッド間で共有しているデータ構造をごみ集めできないので、時折従来技術によるごみ集め604を実施する必要がある。判断603でどちらを実施するか決定する方法としては、たとえば、それぞれのごみ集めを交互に実行する方法や、カウンタを設けてスレッド固有の割付領域だけのごみ集め回数が所定回数に達したかにより全ヒープ領域のごみ集めを実行する方法や、タイマーにより時間的に決める方法、処理が複雑になるがごみ集めにより確保できる空き領域を計数してその割合に応じて決める方法等が考えられる。
【0021】
図7に、実行形式のプログラム204を実行した場合のプロセス701の例を示す。プロセス701は複数のスレッド702とヒープ記憶領域703を有する。ヒープ記憶領域703は、個々のスレッド702に固有の割り付け領域704と、スレッド間で共有する領域705を含む。
【0022】
図6に戻り、判断603においてスレッド単独でごみ集めを実施することにした場合には処理601に進み、そうでなければ処理604に進んで従来技術によるごみ集めを実施する。処理601に進んだ場合、まず、スレッド固有のルート集合(実行時スタック)にある参照を再帰的にたどって到達できる状態フィールド502の値がL(つまり1)のデータ構造のマークフィールド503に、順次1を記録する。この処理により当該スレッド固有のルート集合からたどれるデータ構造、即ち現在スレッドにより使用中と考えられるデータ構造が特定される。記録する作業が終わったら、処理602に進み、スレッド固有の割付け領域704の中にある全てのデータ構造を順次走査し、状態フィールド502の値が1でなおかつマークフィールドの値が0のデータ構造があったら空き領域にする。また、次のごみ集め時にステップ601を実行する準備のために状態フィールド502の値が1でなおかつマークフィールドの値が1のデータ構造があったらマークフィールド503の値を0にする。
【0023】
図3に戻り、状態遷移回数303の計算方法について述べる。これには、図4の処理401で図5のデータ構造のヘッダに書き込んだ割付け文に固有の番号を使い、データ構造への参照を書き込む時点で状態の遷移が発生したら、状態遷移回数303を1加算する。
【0024】
参照を書き込むコードの例を図8に示す。図8のコードではまず、判断801で書き込み先のデータ構造の状態フィールド502を参照し、状態がL、つまり1か検査する。状態がLであれば処理802に進んで参照の書き込みを実施し、そうでないならば処理803、処理804で参照が指示するデータ構造の状態遷移を実施した上で処理802に進む。処理803では書き込む参照を起点として状態フィールド502の値がL(つまり1)のデータ構造だけをたどって到達しうる状態Lのデータ構造の集合を求め、集合中にある全データ構造の状態フィールド502の値をS(つまり0)に変更する。続いて処理804で集合中にある全データ構造について、割り付け元固有の番号を記録したフィールド501を参照し、対応する割付け文の状態遷移回数フィールド303に1を加算する。なお、処理804はプロファイル情報を生成するためだけに必要な処理であり、プロファイル情報を生成しない実行形式ファイル204では省略できる。
【0025】
本実施例によれば、言語処理系により実行形式プログラムに、メモリ割付を実行するコード(図4)、参照の書き込みを実行するコード(図8)を埋め込んでおき、図6のごみ集め処理を実行することで、スレッド固有領域毎のごみ集めと、ヒープ領域全体のごみ集めとを使い分けることができ、ごみ集め処理時にスレッド全体を止める頻度を下げることでシステム性能を向上することができる。
【0026】
次に、最適化処理を工夫することで、実行形式プログラムの実行時の、参照を書き込む処理でデータ構造の状態を変更するときの処理負荷を軽減する他の実施例(第二の実施例)を示す。
【0027】
本実施例では、状態が遷移する確率が高いデータ構造に関しては、最適化処理時に図9で示す割付けコードを割り付ける。メモリ割付時に状態フィールド502の値を最初からSにすることで、参照の書き込みを実行する時の負荷の軽減を図る。図9の割付けコードは状態フィールド502を初期化するときに「状態」フィールドに値S(0)を書き込む処理901を除いて、図4の割付けコードと同一である。
【0028】
図10に最適化の例を示す。図10の処理は図2の最適化処理202の一部を示す。図10の処理では、個々の割付け文について、まず、判断1001でプロファイル情報209があるか調べ、あるならば処理1002に進んでプロファイル情報209から状態遷移の発生する確率を求め、ないならば処理1003に進んでフロー解析により状態が変化する確率を推論し、判断1004に進む。ここで処理1003におけるフロー解析による状態が変化する確率の推定とは、たとえば図11のプログラムの1行目にある割付け文について、その直後にある文で割付けたデータ構造への参照を共有変数へ書き込んでいる、つまり状態がLからSに変化することを検知し、変化する確率が高い(この場合は100%)と推定する作業を表す。続いて、判断1004で変換する確率が高いか判断し、高いならば処理1005に進み、割付け文のコードとしてデータ構造の初期状態をSとする図9のコードを出力し、さもなければ処理1006に進み、割付け文のコードとしてデータ構造の初期状態をLとする図4のコードを出力する。
【0029】
ここで、判断1004での高いかの判断は、実行時の参照書き込み実行時のオーバヘッドと、ごみ集めによる停止時間を短縮する必要性との関係で決まる割合であり、一概には決まらないが、参照書き込み時に状態をLからSに遷移させるためには大きな負荷が生じうることから,簡単には0%を超えたら高いと判断してよい。
【0030】
実行時の負荷を軽減する最適化の他の実施例(第三の実施例)として、参照を書き込むコードを工夫した例を示す。
【0031】
コンパイル時にフロー解析を実施した結果、書き込む参照が指示するデータ構造の状態が必ずSであると判った場合、あるいは書き込み先のデータ構造の状態が必ずLであると判った場合には図12に示す、判断801、処理803、処理804を省略したコードによって参照の書き込みを実施できる。たとえば図11の3行目にある参照の書き込みについては、直前の2行目で同じ参照をクラス変数、つまり複数のスレッドが参照可能なデータ構造に書き込んでいることから、参照が指示するデータ構造の状態が2行目までに必ずSになっていると判断できる。この結果として3行目の参照の書き込みには図12に示す参照書き込みを実行するコードを使用する最適化を適用可能である。
【0032】
また、フロー解析の結果、書き込み先のデータ構造の状態が必ずSであると判った場合には、図13に示す、図8に対して判断801を省略したコードによって参照の書き込みを実施できる。
【0033】
図14に、本実施例の最適化処理の流れを示す。図14の最適化は図2の最適化処理202の一部である。まず、処理1401で、書き込む参照が指示するデータ構造の状態νと書き込み先のデータ構造の状態ιを求め、判断1402で「νが必ずS」あるいは「ιが必ずL」か調べ、そうであるならば処理1403に進み、参照を書き込むコードとして図12のコードを出力する。さもなければ判断1404に進んでιが必ずSか調べ、そうであるならば処理1405に進み、参照を書き込むコードとして図13のコードを出力し、さもなければ処理1406に進んで図8のコードを出力する。以上に記載の最適化により、ごみ集め処理実施時の負荷を軽減できる。
【0034】
なお、上記のいずれの実施例でもデータ構造の状態を、データ構造のヘッダに記録するビットとして表現しているが、これはデータ構造を配置する場所として表現することもできる。たとえば、割付けたスレッドのみが参照しうる状態Lのデータ構造を該スレッド固有の割り付け領域に配置し、複数のスレッドが参照しうる状態Sのデータ構造をスレッド間共有ヒープに配置する。この場合、状態Lから状態Sへの遷移はデータ構造をスレッド固有の割付け領域からスレッド間共有ヒープに移動することにより実現する。
【0035】
また、上記の実施例ではクラス変数を含む全てのデータ構造が図5の形式をもち、ヘッダ部に状態LまたはSが記載してあるものとしているが、クラス変数のように複数のスレッドから参照可能なデータ構造が自明なデータ構造については状態の記載を省略し、クラス変数へ参照を書きこむ際には必ず参照が指示するデータ構造の状態をSに変更するような特例措置を設けることもできる。
【0036】
なお、上記実施例適用前のシステムにおいてデータ構造のうち、割付けたスレッドのみが参照できるものの比率が50%、参照を書き込むコストが実行負荷全体の0.1%を占め、かつ本発明により参照を書き込むコストが10倍になると仮定するとき、プログラム実行時の実行速度が1%程度低下すると見積もれるが、従来技術の全域一括ごみ集めの発生頻度が半分程度になることで処理性能の向上が図れる。
【0037】
【発明の効果】
本発明によれば、スレッドが単独で、つまり他のスレッドを止めることなく、一部のデータ構造について、ごみ集めを実施可能になり、ごみ集めのためにシステムが長期間停止する頻度を下げることができる。
【図面の簡単な説明】
【図1】実行機械のブロック構成を示す図。
【図2】言語処理系の構成例を示す図。
【図3】プロファイル情報を示す図。
【図4】メモリ割付けを実行するコード例(1)を示す図。
【図5】データ構造を示す図。
【図6】ごみ集めの処理を示す図。
【図7】プロセスが実施される状態を模式的に示す図。
【図8】参照の書き込みを実行するコード例(1)を示す図。
【図9】メモリ割付けを実行するコード例(2)を示す図。
【図10】割付け文向け最適化処理を示す図。
【図11】メモリ割付けと参照の書き込みをおこなうソースコードの例を示す図。
【図12】参照の書き込みを実行するコード例(2)を示す図。
【図13】参照の書き込みを実行するコード例(3)を示す図。
【図14】参照の書き込みを実施するコード向け最適化処理を示す図。
【符号の説明】
101…プロセッサ、102…主記憶、103…バス、104…ディスク装置、105…CD−ROM読み取り装置、106…CD−ROM。
【発明の属する技術分野】
本発明は、プログラムの実行系およびプログラミング言語の処理系の技術に関する。特に、ごみ集めによって自動的にメモリ管理をおこなうプログラミング言語およびその実行形式に関する。
【0002】
【従来の技術】
使い終わったメモリ空間を自動的に検出して空き空間に還元し、再利用できるようにするメモリ管理技法にごみ集めがある。ごみ集めには様々な実施方法があるが、トレース式のごみ集めの実施手順を次に示す。まず、実行時に空きメモリを使い果たしたら、ルート集合と呼ぶ、実行時スタックや大域変数などプログラムが参照可能であることが自明なデータ領域中にある参照の集合を求め、該集合からデータ構造を再帰的に辿る。この過程が終了した時点で辿ることがなかったデータ構造を使っていないデータ構造であるとみなし、使っていないデータ構造が占有している領域を空き領域に還元する(例えば非特許文献1参照)。
【0003】
【非特許文献1】Richard Jones and Rafael Lins、 ”Garbage Collection、” John Wiley & Sons、1996
【0004】
【発明が解決しようとする課題】
複数のスレッドが動作する環境下でごみ集めを実施する際に、たとえばごみ集めを実施するきっかけとなったスレッド以外の全てのスレッドが停止される等、スレッド間の同期をとるためのオーバヘッド処理が生じる。サーバなど数多くのスレッドを駆動する環境では、スレッド間の同期をとるためのオーバヘッドの影響が一層大きくなり、システムが長期間に渡って停止することがある。本発明の目的は、ごみ集めの際にスレッド間の同期をとる回数を減らし、システムが長期間に渡って停止する頻度を少なくすることにある。
【0005】
【課題を解決するための手段】
上記目的を達成するために、スレッドに、固有にデータ構造を割り付ける領域を与え、スレッドが該領域中の空き空間を使い果たした場合に、該スレッド単独で、該領域のごみ集めを実施することにより、スレッド間の同期を減らし、システムが長期間停止することを防ぐ。
【0006】
また、スレッド固有の領域のごみ集めはスレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることにより、ごみ集め時の処理を更に軽くする。
【0007】
更に、スレッド毎のごみ集めとヒープ領域全体のごみ集めを選択して実施することで、領域全体のごみ集めも行い、空き領域を十分確保することを可能にする。
【0008】
より詳細には、まず、スレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものを把握する。具体的には、データ構造に対し、割付けたスレッドのみが参照する可能性がある状態Lと、そうでない状態Sを用意する。大域変数など、スレッド間で共有するデータ構造は状態Sである。データ構造は、割付け時点では割付け元のスレッドのみから参照可能であり、したがってスレッドは割付け時点でデータ構造に状態Lを与える。スレッドは、参照を状態Sのデータ構造にストアするにあたり、ストアに先だって、参照先のデータ構造を含め、参照を再帰的にたどって到達しうるデータ構造群が他スレッドから可視になるとみなし、前記データ構造群の状態をSにする。次に、スレッド固有の割付け領域を使い果たしたとき、該スレッド固有のルート集合から状態がLのデータ構造のみを再帰的にたどって到達できない、状態がLのデータ構造の集合を求める。該集合に属するデータ構造は、参照する可能性があるスレッドが自身を割付けたスレッドのみであり、なおかつ、自身を割付けたスレッドに固有のルート集合から到達できないので、使い終わったとみなして解放できる。本ごみ集めでは、参照をデータ構造にストアするに先立ち、ストア先のデータ構造が状態Sか検査し、真ならば参照を再帰的にたどって到達しうる状態Lのデータ構造群の状態をSに変更する。
【0009】
本明細書では、更に上述した検査や状態の変更のオーバヘッドを軽減するためにコンパイラによる最適化時に新しい処理を行う発明も開示する。
【0010】
まず最適化でデータ構造を割付けた時点での初期状態を最適化し、状態の変更が発生する確率を抑える発明である。具体的には、割付けを実施する個々の文について、該文が割付けるデータ構造が状態Lから状態Sに遷移する可能性が高いか調べ、可能性が高いならば、該割付け文のコードとして、最初から状態Sの状態でデータ構造を割付けるコードを出力する。ある割付け文が生成するデータ構造の状態が遷移する確率が高いか否かは、プロファイル情報やフロー解析によって判断できる。
【0011】
最適化により参照を書きこむコードを高速化する発明も開示する。参照を書き込むコードは、書きこみ先のデータ構造の状態がSか検査するコード、検査結果が真である場合に参照を再帰的にたどって到達しうる状態Lのデータ構造の状態をSに変更するコード、参照を書き込むコードという3種類のコードからなるが、前記3種類のコードのうち前2者から生じるオーバヘッドを抑止する。まず、フロー解析によって書きこむ参照が指示するデータ構造の状態νおよび書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、前記状態νが必ずSであると判った場合、あるいは前記状態ιが必ずLであると判った場合には、遷移が不要であり、書きこみ先のデータ構造の状態を検査するコードおよび書きこむ参照を再帰的にたどって状態を遷移させるコードの全体を省略する。この最適化で前記検査および遷移のコードを省略できなかった場合には、前記検査のコードの省略を試みる。具体的には、書きこむ参照が指示するデータ構造書き込み先のデータ構造の状態ιをフロー解析によって調べる。フロー解析の結果、状態ιが必ずSであると判明した場合には、前記検査のコードを省略できる。
【0012】
【発明の実施の形態】
以下本発明の実施例を図面を用いて詳細に説明する。なお、本発明はこの実施例に限定されなるものではない。
【0013】
本実施例の言語処理系のプログラムは図1に示すような計算機上で動作する。計算機はプロセッサ101と主記憶102、バス103、ディスク装置104、CD−ROMドライブ105を有する。ごみ集めを実施するプログラムや、コンパイラなどの言語処理系のプログラムはディスク装置104に保持される。プロセッサ101は、ディスク装置104から言語処理系のプログラムなどを、バス103を介して主記憶102にとりこんで実行する。上述したプログラムは記録媒体、たとえばCD−ROM106からCD−ROMドライブ105を介してディスク装置104にとりこまれる。計算機にネットワークコントローラを持たせ、ネットワークを介してとりこむようにしてもよい。
【0014】
図2に、ごみ集め201および最適化を実施する最適化系202を含む言語処理系の例を示す。図2の言語処理系では、次の手順でソースファイル203を実行形式プログラム204に変換する。まず、ソースファイル203をコンパイラ205でオブジェクトファイル206に変換する。変換の過程で、最適化系202により、最適化を実施する。最適化系は本実施例の特徴部分であるが詳細は後述する。次に、リンカ207により、オブジェクトファイル206と実行時ライブラリ208をリンクして実行形式プログラム204を得る。ごみ集め201は実行時ライブラリ208の一部としてオブジェクトファイルとリンクされる。ごみ集め201も本実施例の特徴部分であり詳細を後述する。コンパイラ205はプロファイル情報を生成するコードをオブジェクトコード中に挿入することも可能であり、プロファイル情報を生成するコードを含む実行形式プログラム204を実行するとプロファイル情報209が得られる。プロファイル情報209はソースファイル203を再度コンパイルする際の最適化処理時などに利用する。
【0015】
図3に、プロファイル情報209が含む情報のうち、本実施例での特徴的な最適化処理に利用される情報の例を示す。図3に示す情報は割付け文の固有の番号301と、該割付け文で割付けを実施した回数302、該割付け文で割付けたデータ構造のうち、状態がLからSに変化したものの数303、割付け文の位置を表す情報304を記録している。ここで、状態Lとはデータ構造に対し、割付けたスレッドのみが参照する可能性がある状態のことであり、状態Sはそうでない状態のことをいう。大域変数など、スレッド間で共有するデータ構造は状態Sである。データ構造の「状態」の値によりスレッドが割付けたデータ構造のうち、自スレッドのみが参照する可能性があるものが把握される。
【0016】
このプロファイル情報は、コンパイル時に個々の割付け文に固有の番号301を割り振り、それに対応する割付け文の位置304を記録しておき、次に、割付け回数302を得るために、個々の割付け文に割付けた回数を記録するためのコードを織り込んでおくことにより得られる。
【0017】
図4に、プロファイル情報を得るための割付け文(メモリ割付を実行するコード)の例を示す。処理401がプロファイル情報を取得するために挿入したコードであり、プロファイル情報の取得をおこなわない実行形式プログラム204を生成するときには、処理401を省略できる。図4に示すコードは、次の手順で割付けを実施する。まず、判断402で空き領域があるか確認し、あれば処理403に進んで空き領域を確保し、なければ処理404に進んでごみ集めを実施し、空き領域を確保した上で処理403に進む。処理403で空き領域を確保したら、処理401に進み、該割付け文で割付けを実施した回数302に1を加算し、また、割付けたデータ構造の先頭(ヘッダ)部分に状態遷移回数303を取得するために必要な情報、つまり該割付け文に固有な番号301を書き込む。
【0018】
図5に割付け文により割り付けられるデータ構造の例を示す。データ構造のヘッダ部分には、割付け文に固有な番号を記録するフィールド501と、データ構造を参照しうるスレッドが割付け元のスレッドのみか否の状態を記録するフィールド502、ごみ集めのときに、実行時スタックなど、ルート集合から参照を再帰的にたどって到達できるか否かを記録するためのフィールド503がある。
【0019】
図4に戻り、処理401でプロファイルに関する処理を実施したら、処理405に進み、割付けたデータ構造の状態フィールド502を初期化し、値Lを書き込む。本実施例では値Lを1、値Sを0とする。続いて処理406に進んでマークフィールド503に「到達できていない」ことを意味する値0を書き込む。最後に処理407で割付け文を実施した結果として、割付けたデータ構造のアドレスを返戻する。
【0020】
図6に、処理404で実施するごみ集めの例を示す。図6の処理601および処理602において、本実施例の特徴的なごみ集めを実施している。図6に示すごみ集め処理では、まず判断603で、空き領域が足らなくなったスレッドが単独で自身の割付け領域(図7の領域704)のみを対象にごみ集めを実施するか、それともヒープ領域全域を対象に、全スレッドを止める従来技術のごみ集め604を実施するかを決める。スレッド固有の割付領域のみのごみ集めではスレッド間で共有しているデータ構造をごみ集めできないので、時折従来技術によるごみ集め604を実施する必要がある。判断603でどちらを実施するか決定する方法としては、たとえば、それぞれのごみ集めを交互に実行する方法や、カウンタを設けてスレッド固有の割付領域だけのごみ集め回数が所定回数に達したかにより全ヒープ領域のごみ集めを実行する方法や、タイマーにより時間的に決める方法、処理が複雑になるがごみ集めにより確保できる空き領域を計数してその割合に応じて決める方法等が考えられる。
【0021】
図7に、実行形式のプログラム204を実行した場合のプロセス701の例を示す。プロセス701は複数のスレッド702とヒープ記憶領域703を有する。ヒープ記憶領域703は、個々のスレッド702に固有の割り付け領域704と、スレッド間で共有する領域705を含む。
【0022】
図6に戻り、判断603においてスレッド単独でごみ集めを実施することにした場合には処理601に進み、そうでなければ処理604に進んで従来技術によるごみ集めを実施する。処理601に進んだ場合、まず、スレッド固有のルート集合(実行時スタック)にある参照を再帰的にたどって到達できる状態フィールド502の値がL(つまり1)のデータ構造のマークフィールド503に、順次1を記録する。この処理により当該スレッド固有のルート集合からたどれるデータ構造、即ち現在スレッドにより使用中と考えられるデータ構造が特定される。記録する作業が終わったら、処理602に進み、スレッド固有の割付け領域704の中にある全てのデータ構造を順次走査し、状態フィールド502の値が1でなおかつマークフィールドの値が0のデータ構造があったら空き領域にする。また、次のごみ集め時にステップ601を実行する準備のために状態フィールド502の値が1でなおかつマークフィールドの値が1のデータ構造があったらマークフィールド503の値を0にする。
【0023】
図3に戻り、状態遷移回数303の計算方法について述べる。これには、図4の処理401で図5のデータ構造のヘッダに書き込んだ割付け文に固有の番号を使い、データ構造への参照を書き込む時点で状態の遷移が発生したら、状態遷移回数303を1加算する。
【0024】
参照を書き込むコードの例を図8に示す。図8のコードではまず、判断801で書き込み先のデータ構造の状態フィールド502を参照し、状態がL、つまり1か検査する。状態がLであれば処理802に進んで参照の書き込みを実施し、そうでないならば処理803、処理804で参照が指示するデータ構造の状態遷移を実施した上で処理802に進む。処理803では書き込む参照を起点として状態フィールド502の値がL(つまり1)のデータ構造だけをたどって到達しうる状態Lのデータ構造の集合を求め、集合中にある全データ構造の状態フィールド502の値をS(つまり0)に変更する。続いて処理804で集合中にある全データ構造について、割り付け元固有の番号を記録したフィールド501を参照し、対応する割付け文の状態遷移回数フィールド303に1を加算する。なお、処理804はプロファイル情報を生成するためだけに必要な処理であり、プロファイル情報を生成しない実行形式ファイル204では省略できる。
【0025】
本実施例によれば、言語処理系により実行形式プログラムに、メモリ割付を実行するコード(図4)、参照の書き込みを実行するコード(図8)を埋め込んでおき、図6のごみ集め処理を実行することで、スレッド固有領域毎のごみ集めと、ヒープ領域全体のごみ集めとを使い分けることができ、ごみ集め処理時にスレッド全体を止める頻度を下げることでシステム性能を向上することができる。
【0026】
次に、最適化処理を工夫することで、実行形式プログラムの実行時の、参照を書き込む処理でデータ構造の状態を変更するときの処理負荷を軽減する他の実施例(第二の実施例)を示す。
【0027】
本実施例では、状態が遷移する確率が高いデータ構造に関しては、最適化処理時に図9で示す割付けコードを割り付ける。メモリ割付時に状態フィールド502の値を最初からSにすることで、参照の書き込みを実行する時の負荷の軽減を図る。図9の割付けコードは状態フィールド502を初期化するときに「状態」フィールドに値S(0)を書き込む処理901を除いて、図4の割付けコードと同一である。
【0028】
図10に最適化の例を示す。図10の処理は図2の最適化処理202の一部を示す。図10の処理では、個々の割付け文について、まず、判断1001でプロファイル情報209があるか調べ、あるならば処理1002に進んでプロファイル情報209から状態遷移の発生する確率を求め、ないならば処理1003に進んでフロー解析により状態が変化する確率を推論し、判断1004に進む。ここで処理1003におけるフロー解析による状態が変化する確率の推定とは、たとえば図11のプログラムの1行目にある割付け文について、その直後にある文で割付けたデータ構造への参照を共有変数へ書き込んでいる、つまり状態がLからSに変化することを検知し、変化する確率が高い(この場合は100%)と推定する作業を表す。続いて、判断1004で変換する確率が高いか判断し、高いならば処理1005に進み、割付け文のコードとしてデータ構造の初期状態をSとする図9のコードを出力し、さもなければ処理1006に進み、割付け文のコードとしてデータ構造の初期状態をLとする図4のコードを出力する。
【0029】
ここで、判断1004での高いかの判断は、実行時の参照書き込み実行時のオーバヘッドと、ごみ集めによる停止時間を短縮する必要性との関係で決まる割合であり、一概には決まらないが、参照書き込み時に状態をLからSに遷移させるためには大きな負荷が生じうることから,簡単には0%を超えたら高いと判断してよい。
【0030】
実行時の負荷を軽減する最適化の他の実施例(第三の実施例)として、参照を書き込むコードを工夫した例を示す。
【0031】
コンパイル時にフロー解析を実施した結果、書き込む参照が指示するデータ構造の状態が必ずSであると判った場合、あるいは書き込み先のデータ構造の状態が必ずLであると判った場合には図12に示す、判断801、処理803、処理804を省略したコードによって参照の書き込みを実施できる。たとえば図11の3行目にある参照の書き込みについては、直前の2行目で同じ参照をクラス変数、つまり複数のスレッドが参照可能なデータ構造に書き込んでいることから、参照が指示するデータ構造の状態が2行目までに必ずSになっていると判断できる。この結果として3行目の参照の書き込みには図12に示す参照書き込みを実行するコードを使用する最適化を適用可能である。
【0032】
また、フロー解析の結果、書き込み先のデータ構造の状態が必ずSであると判った場合には、図13に示す、図8に対して判断801を省略したコードによって参照の書き込みを実施できる。
【0033】
図14に、本実施例の最適化処理の流れを示す。図14の最適化は図2の最適化処理202の一部である。まず、処理1401で、書き込む参照が指示するデータ構造の状態νと書き込み先のデータ構造の状態ιを求め、判断1402で「νが必ずS」あるいは「ιが必ずL」か調べ、そうであるならば処理1403に進み、参照を書き込むコードとして図12のコードを出力する。さもなければ判断1404に進んでιが必ずSか調べ、そうであるならば処理1405に進み、参照を書き込むコードとして図13のコードを出力し、さもなければ処理1406に進んで図8のコードを出力する。以上に記載の最適化により、ごみ集め処理実施時の負荷を軽減できる。
【0034】
なお、上記のいずれの実施例でもデータ構造の状態を、データ構造のヘッダに記録するビットとして表現しているが、これはデータ構造を配置する場所として表現することもできる。たとえば、割付けたスレッドのみが参照しうる状態Lのデータ構造を該スレッド固有の割り付け領域に配置し、複数のスレッドが参照しうる状態Sのデータ構造をスレッド間共有ヒープに配置する。この場合、状態Lから状態Sへの遷移はデータ構造をスレッド固有の割付け領域からスレッド間共有ヒープに移動することにより実現する。
【0035】
また、上記の実施例ではクラス変数を含む全てのデータ構造が図5の形式をもち、ヘッダ部に状態LまたはSが記載してあるものとしているが、クラス変数のように複数のスレッドから参照可能なデータ構造が自明なデータ構造については状態の記載を省略し、クラス変数へ参照を書きこむ際には必ず参照が指示するデータ構造の状態をSに変更するような特例措置を設けることもできる。
【0036】
なお、上記実施例適用前のシステムにおいてデータ構造のうち、割付けたスレッドのみが参照できるものの比率が50%、参照を書き込むコストが実行負荷全体の0.1%を占め、かつ本発明により参照を書き込むコストが10倍になると仮定するとき、プログラム実行時の実行速度が1%程度低下すると見積もれるが、従来技術の全域一括ごみ集めの発生頻度が半分程度になることで処理性能の向上が図れる。
【0037】
【発明の効果】
本発明によれば、スレッドが単独で、つまり他のスレッドを止めることなく、一部のデータ構造について、ごみ集めを実施可能になり、ごみ集めのためにシステムが長期間停止する頻度を下げることができる。
【図面の簡単な説明】
【図1】実行機械のブロック構成を示す図。
【図2】言語処理系の構成例を示す図。
【図3】プロファイル情報を示す図。
【図4】メモリ割付けを実行するコード例(1)を示す図。
【図5】データ構造を示す図。
【図6】ごみ集めの処理を示す図。
【図7】プロセスが実施される状態を模式的に示す図。
【図8】参照の書き込みを実行するコード例(1)を示す図。
【図9】メモリ割付けを実行するコード例(2)を示す図。
【図10】割付け文向け最適化処理を示す図。
【図11】メモリ割付けと参照の書き込みをおこなうソースコードの例を示す図。
【図12】参照の書き込みを実行するコード例(2)を示す図。
【図13】参照の書き込みを実行するコード例(3)を示す図。
【図14】参照の書き込みを実施するコード向け最適化処理を示す図。
【符号の説明】
101…プロセッサ、102…主記憶、103…バス、104…ディスク装置、105…CD−ROM読み取り装置、106…CD−ROM。
Claims (12)
- プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行う方法であって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域の範囲でごみ集めを行うことを特徴とするごみ集め方法。 - 請求項1のごみ集め方法において、前記スレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることを特徴とするごみ集め方法。
- プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行う方法であって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域毎のごみ集め処理と、全領域のごみ集め処理のいずれの処理を行うかを判断し、
決定された範囲内のごみ集め処理を実行することを特徴とするごみ集め方法。 - データ構造について、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッドのみである状態Lと、そうとは限らない状態Sの2つの状態を設け、
あるスレッドが割付けたデータ構造Aが、前記状態Lにあるとき、前記スレッドが前記データ構造Aへの参照を、前記状態Sにあるデータ構造に記録しようとする場合に、該記録に先行して前記データ構造Aと、前記データ構造Aから参照を再帰的に辿って到達しうる、前記状態Lにあるデータ構造の状態を、前記状態Sに変更する処理を実施しておき、
前記スレッドがごみ集めを実施する際に、前記スレッド固有のルート集合から参照を辿って到達することができず、かつ、前記スレッドのみが参照する可能性がある状態Lにあるデータ構造を空き領域にするごみ集め方法。 - データ構造を割付けるコードについて、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にない状態Lで割付ける第一のコードと、そうとは限らない状態Sで割付ける第二のコードを用意し、入力プログラム中のデータ構造の割付けを実施する文について、該実施文向けのコードとして前記第一のコードを用いた場合に、割付けたデータ構造の状態が、状態を変更する動作によって状態Lから状態Sに変わる確率が高いか否かを、プロファイル情報またはフロー解析から求め、高いと判断できる場合に、前記実施文向けのコードとして、前記第二のコードを出力し、そうでない場合に前記第一のコードを出力することを特徴とするコンパイル方法。
- 参照Rをデータ構造Bに書きこむコードについて、前記データ構造Bが、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にないことを示す状態Lであるか検査し、状態Lでない場合に、前記参照Rを再帰的にたどって到達しうるデータ構造の状態を前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Sにした上で前記参照Rを前記データ構造Bに書きこむコードγと、前記検査および変更を実施せずに前記参照Rを前記データ構造Bに書きこむコードδを用意し、入力プログラム中の参照をデータ構造に書きこむ文Fについて、該文Fが書きこむ参照Rが指示するデータ構造の状態Uや、書きこみ先のデータ構造Bの状態Vをフロー解析によって調べ、前記状態Uが前記状態Sにあると判明した場合、あるいは前記状態Vが必ず前記状態Lにあると判明した場合に、前記文F向けのコードとして、前記コードδを出力し、そうでない場合に、前記コードγを出力することを特徴とするコンパイル方法。
- 参照Qをデータ構造Cに書きこむコードについて、前記参照Qを前記データ構造Cに書きこむ前に前記データ構造Cの状態が、前記データ構造を参照する可能性があるスレッドが前記データ構造を割付けたスレッド以外にない状態Lか検査し、そうでない場合に前記参照Qを再帰的に辿って到達しうるデータ構造の状態を、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Sにするコードεと、前記参照Qを前記データ構造Cに書きこむ前に前記参照Qを再帰的に辿って到達しうるデータ構造の状態を前記状態Sにするコードωを用意し、入力プログラム中の参照をデータ構造に書きこむ文Gについて、書きこみ先の前記データ構造Cの状態Vをフロー解析によって調べ、前記状態Vが前記状態Sであると判明した場合に、前記文G向けのコードとして、前記コードωを出力し、そうでない場合に、前記コードεを出力することを特徴とするコンパイル方法。
- プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行うプログラムであって、
前記プロセッサが実行するスレッドごとに固有に割り付けられた領域を特定するステップと、
特定された領域の範囲でごみ集めを実行するステップとを有するプログラム。 - 請求項8のプログラムにおいて、前記スレッドが割り付けたデータ構造について、該データ構造を参照する可能性があるスレッドが当該スレッド以外にはないデータ構造をごみ集めの対象とすることを特徴とするプログラム。
- プロセッサとメモリを含む情報処理装置において、前記プロセッサにより複数スレッドが実行される環境で前記プロセッサの処理としてメモリのごみ集めを行うプログラムであって、
前記プロセッサが実行するスレッド毎に固有に割り付けられた領域毎のごみ集め処理と、全領域のごみ集め処理のいずれの処理を行うかを判断し、
決定された範囲内のごみ集め処理を実行することを特徴とするプログラム。 - データ構造を割付けるコードについて、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にない状態Lで割付ける第一のコードと、そうとは限らない状態Sで割付ける第二のコードを用意し、
入力プログラム中のデータ構造の割付けを実施する文について、該実施文向けのコードとして前記第一のコードを用いた場合に、割付けたデータ構造の状態が、状態を変更する動作によって状態Lから状態Sに変わる確率が高いか否かを、プロファイル情報またはフロー解析から求め、高いと判断できる場合に、前記実施文向けのコードとして、前記第二のコードを出力し、そうでない場合に前記第一のコードを出力することを特徴とするコンパイラ。 - 参照Rをデータ構造Bに書きこむコードについて、前記データ構造Bが、前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にないことを示す状態Lであるか検査し、状態Lでない場合に、前記参照Rを再帰的にたどって到達しうるデータ構造の状態を前記データ構造を参照する可能性があるスレッドが、前記データ構造を割付けたスレッド以外にあることを示す状態Sにした上で前記参照Rを前記データ構造Bに書きこむコードγと、前記検査および変更を実施せずに前記参照Rを前記データ構造Bに書きこむコードδを用意し、入力プログラム中の参照をデータ構造に書きこむ文Fについて、該文Fが書きこむ参照Rが指示するデータ構造の状態Uや、書きこみ先のデータ構造Bの状態Vをフロー解析によって調べ、前記状態Uが前記状態Sにあると判明した場合、あるいは前記状態Vが必ず前記状態Lにあると判明した場合に、前記文F向けのコードとして、前記コードδを出力し、そうでない場合に、前記コードγを出力することを特徴とするコンパイラ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003079341A JP2004287870A (ja) | 2003-03-24 | 2003-03-24 | ごみ集め方法及びコンパイル方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003079341A JP2004287870A (ja) | 2003-03-24 | 2003-03-24 | ごみ集め方法及びコンパイル方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004287870A true JP2004287870A (ja) | 2004-10-14 |
Family
ID=33293473
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003079341A Pending JP2004287870A (ja) | 2003-03-24 | 2003-03-24 | ごみ集め方法及びコンパイル方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004287870A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009543236A (ja) * | 2006-07-14 | 2009-12-03 | インテル コーポレイション | マルチタスク仮想マシンのためのヒープ組織 |
JP2013058270A (ja) * | 2012-12-28 | 2013-03-28 | Intel Corp | マルチタスク仮想マシンのためのヒープ組織 |
-
2003
- 2003-03-24 JP JP2003079341A patent/JP2004287870A/ja active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009543236A (ja) * | 2006-07-14 | 2009-12-03 | インテル コーポレイション | マルチタスク仮想マシンのためのヒープ組織 |
JP2013058270A (ja) * | 2012-12-28 | 2013-03-28 | Intel Corp | マルチタスク仮想マシンのためのヒープ組織 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2014504768A (ja) | 領域に基づくガベージ・コレクタを用いてクラスを漸進的にアンロードするための方法、コンピュータ・プログラム製品、および装置 | |
JP5733860B2 (ja) | 依存問題の効率的並列計算 | |
JP3956112B2 (ja) | コンパイラ、レジスタ割当装置、プログラム、記録媒体、コンパイル方法、及びレジスタ割当方法 | |
EP2915051B1 (en) | Memory device and host device | |
JP5618796B2 (ja) | 計算機、計算機の制御方法及びプログラム | |
US20060242633A1 (en) | Compiling computer programs to exploit parallelism without exceeding available processing resources | |
US20100211753A1 (en) | Parallel garbage collection and serialization without per-object synchronization | |
US8990551B2 (en) | Analysis and visualization of cluster resource utilization | |
JP2011527788A5 (ja) | ||
US8056061B2 (en) | Data processing device and method using predesignated register | |
US20070192388A1 (en) | Method of and apparatus for managing memory | |
US7454448B1 (en) | Synchronizing object promotion in a multi-tasking virtual machine with generational garbage collection | |
US20180217779A1 (en) | Multiple stage garbage collector | |
KR102139043B1 (ko) | 메모리 관리를 위한 보존 가비지 콜렉팅 및 정수 태깅 기법 | |
EP3564898A1 (en) | Apparatus and methods for generating dynamic trace data on a gpu | |
US7676511B2 (en) | Method and apparatus for reducing object pre-tenuring overhead in a generational garbage collector | |
US10628306B2 (en) | Garbage collector | |
JP2009026081A (ja) | メモリ管理方法、情報処理装置及びメモリ管理プログラム | |
US8972629B2 (en) | Low-contention update buffer queuing for large systems | |
JP5391422B2 (ja) | メモリ管理方法、計算機システム及びプログラム | |
JPH09212369A (ja) | 記憶域割り付け装置 | |
US20080098368A1 (en) | Automatic native generation | |
JP2007207120A (ja) | システム検証装置及びその検証方法 | |
JP2004287870A (ja) | ごみ集め方法及びコンパイル方法 | |
KR101961501B1 (ko) | 메모리 관리를 위한 동시 마킹 및 동시 스위핑을 이용한 보존적인 불용 정보 수집 기법 |