JPH10320263A - Gcアタッチメント装置及びプログラム記憶媒体 - Google Patents

Gcアタッチメント装置及びプログラム記憶媒体

Info

Publication number
JPH10320263A
JPH10320263A JP13176297A JP13176297A JPH10320263A JP H10320263 A JPH10320263 A JP H10320263A JP 13176297 A JP13176297 A JP 13176297A JP 13176297 A JP13176297 A JP 13176297A JP H10320263 A JPH10320263 A JP H10320263A
Authority
JP
Japan
Prior art keywords
storage area
area
allocation
application program
attachment device
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.)
Withdrawn
Application number
JP13176297A
Other languages
English (en)
Inventor
Akihiko Kato
昭彦 加藤
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP13176297A priority Critical patent/JPH10320263A/ja
Publication of JPH10320263A publication Critical patent/JPH10320263A/ja
Withdrawn legal-status Critical Current

Links

Abstract

(57)【要約】 【課題】本発明は、既存の動的記憶領域管理装置とは別
に設けられて、記憶領域の回収処理を実行するGCアタ
ッチメント装置の提供を目的とする。 【解決手段】記憶領域の割当要求が発行されるときに、
領域長を格納する制御情報格納域を付加する形で記憶領
域を獲得するとともに、記憶領域に対応付けて設けられ
る割当ビットのベクトルの内、その記憶領域の指す割当
ビットを割当モードにセットする手段と、割当ビットベ
クトル/制御情報格納域の領域長を参照することで、割
り当てられた記憶領域の内、応用プログラムより指され
るものを特定して、それ以外の記憶領域を開放するとと
もに、その開放した記憶領域の指す割当ビットを未割当
モードにリセットする手段と、記憶領域の開放要求が発
行されるときに、その記憶領域を開放するとともに、そ
の開放した記憶領域の指す割当ビットを未割当モードに
リセットする手段とを備えるように構成する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、既存の動的記憶領
域管理装置とは別に設けられて、応用プログラムで不要
となった記憶領域を回収するGCアタッチメント装置
と、それを実現するプログラムを記憶するプログラム記
憶媒体とに関する。
【0002】
【従来の技術】
〔1ー1〕動的記憶領域管理装置とごみ集め装置 実行中に随時記憶領域の割り当て・開放が多数発生する
ような応用プログラムが多くある。
【0003】さらに、その種の応用プログラムの中に
は、動的に割り当てられた領域がある時点で不用になっ
たかどうかを調べることが不可能、非常に困難、あるい
はコストが高すぎるものがある。そのようなソフトウエ
アの典型的な例としては、記号処理システムがある。
【0004】前者に対応するため、種々の動的記憶領域
管理装置が使用されている。後者に対しては、適当なタ
イミングで応用プログラム内で不用になった領域を自動
的に探索・回収するごみ集め(ガーベジコレクタ、以下
ではGCと略記する)装置が必要である。
【0005】ところが、GCは、応用プログラムと密接
な関係を持つ必要がある。例えば、通常、ヒープ領域
(応用プログラムの作業領域)を参照するポインタの位
置や、割り当てられた領域内のポインタの位置をすべて
知る必要がある。従って、GCを必要とするソフトウエ
アを作成するためには工夫や労力が必要とされる。
【0006】そのため、GCを行なうソフトウエアの作
成のため、多くは以下のような方法が用いられている。 〔1ー2〕GCを行なうソフトウエアの作成とその問題
点 〔1ー2ー1〕応用プログラムにGCを組み込みで作成 まず考えられることは、応用プログラムを作成する際に
専用のGCを組み込みの形で同時に作成することがあげ
られる。
【0007】この方法では、GCはその応用プログラム
の専用であって、通常、他のプログラムからアクセスす
ることはない。また、開発は、GCと他の部分を密接に
関連付けながら同時に行なわざるを得ないので、信頼性
を保つためには多くの時間と労力がかかる。
【0008】このように、応用プログラムにGCを組み
込みで作成することには、困難が伴うのである。 〔1ー2ー2〕GCを内部に持っている開発言語を使用
する プログラム言語の中には、GC装置をすでに内部で持っ
ているものがある。記号処理用言語のLISP言語など
は有名であるが、その他、数式処理、高機能の対象指向
言語など様々なものがある。これは、「プログラム言語
処理系」という応用プログラムを、上の方法でGC込み
で作成したものともいえるが、言語は開発の道具である
から、別扱いするべきである。
【0009】このような言語を使えば、開発者はGCに
頭を悩ませることなく効率的にプログラム開発が行なえ
る。GCと応用プログラムとの密接な関連付けの部分は
言語処理系が負担するからである。
【0010】ただし、このような言語は、GCを多用す
るような特殊目的用だったり、内部で複雑あるいは特殊
な型を使用したりするものが多いので、他の言語では速
く実行できる部分でも効率が悪いことがある。例えば、
整数データを1つ増やす処理を行なうとき、通常の手続
き型言語では、そのデータのある語に対して整数増加の
機械語命令を実行するだけであるが、LISP言語で
は、何も手を打たなければ、別のデータ領域をわざわざ
割り当てて、そこに元のデータより1つ大きい値の整数
データを作成することになる。
【0011】また、このような言語は、その中で世界が
閉じてしまい、他の言語で開発されたプログラムとの結
合がやっかいになることが多い。これは内部処理が他の
言語と異なることが多いからである。特に、複雑・特殊
な言語でつくられたプログラムから簡素な言語でできた
ライブラリを呼び出すことは可能であっても、複雑・特
殊な言語でできたルーチンをライブラリとして簡素な言
語から呼び出すことは通常困難である。
【0012】従って、ある専門目的のソフトウエアを開
発するとき、その目的に合った言語ならば、この種の言
語を利用することは非常によい方法であるが、汎用のソ
フトウエアであって、一部分だけGCを行ない、他の部
分を通常の処理にしたい場合などには不適当である。
【0013】例として、対象指向言語では、多くの対象
はある程度まで生成・消滅の規則があることが多い。例
えば、何重にも開かれたウインドウを消す場合は、入れ
子の内側、すなわち一番最近に生成したウインドウから
消去される。このような規則がある場合には、記憶領域
管理にそのような規則を利用することが可能である。し
かし、この規則が成り立たない対象が混ざる場合もあ
る。例えば記号処理のような処理を行なう場合である。
この場合には、一部の対象のみGCを手軽に行なうよう
にできると便利である。
【0014】また、現在広く使われている言語には、G
Cがないものが多く、それらを使ってプログラムせざる
を得ない場合が多いことも問題である。このように、G
Cを内部に持っている開発言語を使用することにも、困
難が伴うのである。 〔1ー2ー3〕汎用のGC装置を独立に作成する 汎用のGC装置を独立に作ることができれば便利である
が、このような発想そのものが今までほとんどなかった
ため、この装置は非常に少ない。
【0015】ただし、保守的GCと呼ばれる手法が創案
されたために、この考え方が現実的になってきている。
GCと応用プログラムとの関連付けで最も大きな比重を
占めるのはポインタによる結合状態の管理であるが、保
守的方法は、応用プログラムからほとんど情報を要求せ
ずにそれを解決するからである。なお、保守的GCは、
「H.J.Boehm: Garbage Collection in an Uncooperativ
e Environment,Software-Practice and Experiencep,Vo
l.18(9),pp.807-920,Sep.1988 」に紹介されている。
【0016】この独立型GC装置は、上で述べた問題を
解決するので今までなかった応用が期待される。しか
し、この場合でも、これまでに開示されている独立型G
C装置は、独自に専用の動的記憶領域管理装置を部分と
して持っているため、開発言語が持っている(厳密に
は、多くはOSの機能として持っている)動的記憶領域
管理装置と二重に持つことになるという無駄がある。
【0017】
【発明が解決しようとする課題】このようなことを背景
にして、本発明は、次のような課題を解決することを目
的としている。 (1)GC装置が複雑・重くなることを阻止する。
【0018】GCを応用プログラムに組み込みで開発す
ることは開発コストが高く、プログラムも複雑になる。
また、GC機能を持つ開発言語は、それ自身重いシステ
ムとなりやすい。GC機能を簡単に得るための手軽な部
品が必要である。 (2)GC装置の影響を最小限に抑える。
【0019】GCを応用プログラムの組み込みで開発し
ようと、あるいはGCを行なう言語を使用しようと、応
用プログラムのGCと関係ない部分への影響が出やす
い。これから、GCと関係ない部分には、GC装置の影
響により効率低下を起こさないようにしたい。 (3)他のプログラムと結合できる応用プログラムを作
成可能にしたい。
【0020】応用プログラム自身が、なんらかの目的の
ためのライブラリである場合、GC機能があるために他
のプログラムと結合できないのでは目的を達成できな
い。例えば、LISP言語で作成した関数をライブラリ
として、C言語のプログラムから単なるサブルーチンと
して呼ぶことは通常困難である。
【0021】自家製のGC装置をもち、かつ他のプログ
ラムと結合可能なライブラリを作成することは理屈から
いえば可能であるが、制御は少々困難と思われる。ま
た、このようなライブラリが2つ以上ある場合には、G
C装置もそれぞれ別個に同時に存在することになり、計
算機に非常に大きな負荷をかけることになる。
【0022】特殊な処理を応用プログラムに強制しない
独立式のGC装置があれば、これは可能であるが、独立
式のGC装置は非常に少なく、また下に述べるように、
従来の独立式のGC装置にも無駄はある。 (4)システムを小さくし、無駄を省く。
【0023】GCを行なわない言語であっても、動的記
憶領域管理装置は通常内部に持っている。GC装置を独
立に作るにしても、別の動的記憶領域管理装置を作成す
るのは、同じような目的の装置が同一プログラム内に二
重に存在することになる。
【0024】既存の動的記憶領域管理装置では不十分な
ほど、効率等を必要とする場合は、やはり専門の管理装
置が必要であるが、そうでない場合には無駄である。ま
た、専門の管理装置が必要な場合でも、効率以外の振舞
をテストするプロトタイプ作成などでは、既存の動的記
憶領域管理装置を用いることで手軽な方法で行なうこと
もできる。
【0025】本発明はかかる事情に鑑みてなされたもの
であって、既存の動的記憶領域管理装置とは別に設けら
れて、応用プログラムで不要となった記憶領域を回収す
る新たなGCアタッチメント装置の提供と、それを実現
するプログラムを記憶するプログラム記憶媒体の提供と
を目的とする。
【0026】
【課題を解決するための手段】図1に本発明の原理構成
を図示する。図中、1は本発明を具備するGCアタッチ
メント装置であって、既存動的記憶領域管理装置2とは
別に設けられて、応用プログラム3で不要となった記憶
領域を回収するものである。
【0027】本発明のGCアタッチメント装置1は、領
域割当部10と、割当ビットベクトル管理部11と、G
C処理部12と、領域開放部13と、制御部14とを備
える。
【0028】この領域割当部10は、応用プログラム3
から処理対象となるヒープ領域内の記憶領域の割当要求
が発行されるときに、既存動的記憶領域管理装置2を起
動することで、記憶領域の長さ情報を格納する制御情報
格納域を付加する形で、応用プログラム3に割り当てる
記憶領域を獲得するとともに、処理対象となるヒープ領
域に対応付けて設けられる割当ビットのベクトルの内、
その獲得した記憶領域の指す割当ビットを割当モードに
セットする。
【0029】割当ビットベクトル管理部11は、処理対
象となるヒープ領域に対応付けて設けられる割当ビット
ベクトルを管理する。GC処理部12は、領域割当部1
0により割り当てられた記憶領域の内、ヒープ領域以外
の記憶領域から応用プログラム3により直接的及び間接
的に指されることになるものを特定して、既存動的記憶
領域管理装置2を起動することで、その特定した記憶領
域以外の記憶領域を開放するとともに、その開放した記
憶領域の指す割当ビットを未割当モードにリセットす
る。
【0030】領域開放部13は、応用プログラム3から
記憶領域の開放要求が発行されるときに、既存動的記憶
領域管理装置2を起動することで、その記憶領域を開放
するとともに、その開放した記憶領域の指す割当ビット
を未割当モードにリセットする。
【0031】制御部14は、領域割当部10や割当ビッ
トベクトル管理部11やGC処理部12や領域開放部1
3に対して、初期化処理やパラメータ設定処理等を実行
する。
【0032】この構成を採るときにあって、GC処理部
12は、領域割当部10の獲得する制御情報格納域に設
けられる作業フラグにマークを付けながら記憶領域の追
跡処理を実行することで、正確な追跡処理を実行するこ
とがある。
【0033】また、割当ビットベクトル管理部11は、
割当ビットベクトルを複数のブロックを単位として管理
することがある。このとき、領域割当部10は、割当ビ
ットベクトルにより占有される記憶領域を少なくするた
めに、割当ビットベクトルのブロックが必要となるとき
に、既存動的記憶領域管理装置2を起動することで、割
当ビットベクトルのブロックを動的に生成していくこと
がある。また、領域開放部13は、領域割当部10によ
る記憶領域の割り当てが不可能なときに、既存動的記憶
領域管理装置2を起動することで、未割当を表示する割
当ビットベクトルのブロックを開放していくことがあ
る。
【0034】GC処理部12は、領域割当部10による
記憶領域の割り当てが実行できないときに処理に入った
り、応用プログラム3に割り当てることが可能な記憶領
域が少なくなったときに処理に入る。例えば、領域割当
部10により割り当てられる記憶領域の番地が規定の境
界値に到達するときに、応用プログラム3に割り当てる
ことが可能な記憶領域が少なくなったと判断して処理に
入ることになる。このとき、記憶領域の回収効率に応じ
て境界値を動的に変更したり、応用プログラムからの指
示に応答して境界値を動的に変更することがある。
【0035】このように構成される本発明のGCアタッ
チメント装置1では、応用プログラム3が処理対象とな
るヒープ領域内の記憶領域の割当要求を発行すると、領
域割当部10は、既存動的記憶領域管理装置2を起動す
ることで、記憶領域の長さ情報を格納する制御情報格納
域を付加する形で、応用プログラム3に割り当てる記憶
領域を獲得するとともに、処理対象となるヒープ領域に
対応付けて設けられる割当ビットベクトルの内、その獲
得した記憶領域の指す割当ビットを割当モードにセット
する。
【0036】このようにして、応用プログラム3に任意
の長さの記憶領域を割り当てていくときに、GC処理部
12は、例えば、応用プログラム3に割り当てることが
可能な記憶領域が少なくなるときに処理に入って、割当
ビットベクトル及び制御情報格納域の長さ情報を参照す
ることで、領域割当部10により割り当てられた任意の
長さを持つ記憶領域を抽出しつつ、それらの記憶領域の
内、ヒープ領域以外の記憶領域から応用プログラム3に
より直接的及び間接的に指されることになるものを特定
して、それらの記憶領域については応用プログラム3が
現在も使用中であると判断する。そして、既存動的記憶
領域管理装置2を起動することで、その使用中であると
判断した記憶領域以外の記憶領域を開放するとともに、
その開放した記憶領域の指す割当ビットを未割当モード
にリセットする。
【0037】そして、領域開放部13は、応用プログラ
ム3から記憶領域の明示的な開放要求が発行されるとき
に、既存動的記憶領域管理装置2を起動することで、そ
の記憶領域を開放するとともに、その開放した記憶領域
の指す割当ビットを未割当モードにリセットする。
【0038】このように、本発明のGCアタッチメント
装置1では、ヒープ領域以外の記憶領域から応用プログ
ラム3により直接的及び間接的に指されることになるヒ
ープ領域内の記憶領域は、応用プログラム3が使用中で
あると見なす方法(実際には、ヒープ領域へのポインタ
でないこともあるが、そう見なすことによって、応用プ
ログラム3が実際に使用中の記憶領域を開放してしまう
という不都合を防止できる。この方法が上述した保守的
方法と呼ばれるものである。)を用いる構成を採り、更
に、記憶領域の長さ情報を格納する制御情報格納域を付
加する形で、応用プログラム3に割り当てる記憶領域を
獲得するとともに、割当ビットベクトルを使って、応用
プログラム3に割り当てた記憶領域であるのか否かを管
理する構成を採ることで、任意の長さを持つ記憶領域を
応用プログラム3に割り当てることを可能にし、これに
より応用プログラム3とは独立した形のGC装置を実現
できるようになる。
【0039】なお、GCに全く関わりのない領域につい
ては、統計情報等が必要となる場合を除いて、応用プロ
グラム3は、直接、既存動的記憶領域管理装置2を使用
することもできる。
【0040】次に、本発明の原理構成について更に詳述
する。本発明は、GCを行なわない動的記憶領域管理装
置、あるいは、そのような動的記憶領域管理装置を持つ
プログラム言語に対して、GCを行なう機能を付加する
装置を提供することにより、既存の動的記憶領域管理装
置をGCを行なう装置に変える。
【0041】すなわち、本発明は、図2に示すように、
既存のごみ集めのない動的記憶領域管理装置にごみ集め
アタッチメントを取り付けることにより、全体として、
ごみ集めを持つ動的記憶領域管理装置として働くことを
実現している。この本発明のごみ集めアタッチメント
は、GCの機能を実現するのに最小限の機能を提供する
装置であるため、簡素な装置で効率よく実現される。
【0042】このとき、本発明のごみ集めアタッチメン
トの処理対象となるヒープ領域を適切に設定すること
で、図3に示すように、応用プログラムが必要とする動
的記憶領域のうち、GCを必要としないものは、既存の
動的記憶領域の機能をそのまま用いて割り当て・開放を
行ない、GCを必要とする領域に関しては、本発明のご
み集めアタッチメントを通して割り当て・開放を行なう
ことになる。
【0043】ここで、GCが必要な領域とは、割り当て
られた領域がいつ不必要になるか探知することが困難/
不可能である場合、あるいは容易ではあっても、不必要
になった時点ですべて開放するコ−ドを挿入するとプロ
グラムが甚だしく不透明・コスト高になるなど、明示的
開放が難しい場合である。また、GCが不必要な領域と
は、割り当てられた領域が不必要になったときが容易に
わかり、その都度明示的に開放することが何らの障害に
ならない場合である。特に、生成された後、プログラム
の終了まで使用され続けるような領域は、不用にならな
いという事実がわかっているのでGCの不必要な場合に
あたる。
【0044】なお、本明細書の実施例のアルゴリズムで
は、マーク部で、ヒープにルートがある場合の探索を行
っていないので、GCの必要な領域へのポインタを持つ
領域もGC必要領域としている。このことによるエラー
を避けるためには、ポインタを持つ領域を無条件でGC
必要領域と見なす方法がある。もちろん、アルゴリズム
を変えることもできるが、前者の方法の方が効率はよい
と思われる。
【0045】本発明のごみ集めアタッチメントは、この
二種類の領域が任意の割合で混在して使用されている状
態で正常に働く。なお、C++言語などの多くの対象指
向言語では、対象実体が不必要になった時点で標準の開
放手続き(あるいは利用者が対象を定義した時に設定し
た開放手続き)を自動的に呼ぶため、利用者は、対象実
体を使用するときは、実体に占有されていたメモリの開
放方法やそのタイミングを気にせずにプログラミングが
できる。しかし、このような制御方法が効果を現すの
は、実体が不必要になった時点が容易な仕組みで直接・
間接に決定できるときに限るので、本発明では、このよ
うな制御方法も「明示的開放」に含めるものとする。
【0046】従って、このような制御方法を使用するこ
とで解決できる場合は、上に言う「GCが不必要な場
合」に当たる。一般にGC装置は、例えば上記のような
制御方法であってもなお、領域が不必要になった時点を
決定することが困難な場合を解決するものであり、本発
明はそのGC機能を与えるものである。もちろん、上記
のような制御方法が与えられていない場合には、GC機
能で代用することも有用である。
【0047】本発明のごみ集めアタッチメントでは、動
的記憶領域管理装置がGCを必要とする時点を察知する
ために、図4に示すように、割り当てる領域の番地がG
C境界値に到達するときにGCを起動するという手法を
導入している。
【0048】このGC境界の手法は、既存の動的記憶領
域管理装置がヒープ領域の空いている部分を、一方の端
(例えば、番地の小さい方)から探索する傾向のある場
合に正常に働く。具体的に言えば、典型的には、既存の
動的記憶領域管理装置がファースト・フィット法と呼ば
れる手法あるいはその変形の手法を使っている場合であ
る。ここでファースト・フィット法とは、領域割り当て
が要求された場合、ヒープ領域の先頭から要求された大
きさ以上の連続した空き領域が存在する部分を探し、最
初に見つかった連続空き領域から必要分を切り出す手法
である。領域開放の際は、ファースト・フィット法では
開放される領域の前後に未使用部分があれば、その都度
可能な限り連結しておく。
【0049】このような動的記憶領域管理装置では、空
き領域が少なくなるにつれて、割り当てられる領域の番
地が大きくなる傾向にある。従って、GC境界と呼ばれ
る変数にヒープ領域のある特定の番地をセットしてお
き、割り当ての結果がGC境界の番地以前にあるときは
GCを行なわず、結果がGC境界の番地より後になった
時GCを起動する。
【0050】このGC境界の変数値は、応用プログラム
の実行中に変えることができるので、GCのタイミング
をある程度コントロールすることができる。GC境界の
手法の使える装置には制限があるが、ファースト・フィ
ット法は広く使われている方法であり、GC境界の手法
が使える場合は、番地を調べるだけのわずかな労力・時
間でGCのタイミングの監視が可能なため、このGC境
界の手法は非常に有用である。
【0051】本発明のごみ集めアタッチメントでは、割
当ビットのベクトルを使って、応用プログラムに割り当
てた領域であるのか否かを管理する構成を採るととも
に、この割当ビットベクトルを動的に生成し開放するフ
レキシブルな構成を採っている。
【0052】一般にビットベクトルは様々な用途に使用
されるが、本発明のフレキシブルな割当ビットベクトル
は、記憶領域が割り当て済みなのか否かの印を付けるた
めに用意されるものであり、更に、この用途において、
印付けが必要となる範囲が不明確あるいは動的に変わる
場合に対応するために工夫されたものである。
【0053】本発明の割当ビットベクトルは、印付けに
関係すると思われる仮想的な範囲に対して設定され、更
に、その割当ビットベクトルはいくつかの部分に分割さ
れ、最初は各部分の割当ビットベクトルの実体は生成さ
れない。その後、プログラム実行中において割当ビット
ベクトルが存在しない位置のビットを“1”とする必要
が実際に生じたときに、その対応する部分の割当ビット
ベクトルが生成されることになる。
【0054】このことにより、実際に使用しない割当ビ
ットベクトル部分のメモリ割り当てを少なくすることが
できる。本発明のごみ集めアタッチメントは、既存の動
的記憶領域管理装置と結合して、あたかも新規の動的記
憶領域管理装置であるかのような振る舞いをする。この
振る舞いを実現するために、本発明のごみ集めアタッチ
メントは、応用プログラムに対して、初期化ルーチン
や、領域割当ルーチンや、領域開放ルーチンや、必要な
ら種々の制御ルーチン(パラメータ変更用など)を提供
する。
【0055】通常の手続き型言語では、新しい領域割当
・開放ルーチンは、既存の動的記憶領域管理装置のルー
チン名とは異なる名前となるであろうが、C++言語な
どのように関数名・演算子のオーバーロードを許す言語
では、同じ名前・記号を使用して中身を切替えることも
可能である。ただし、何らかの統計情報が必要となる場
合は、既存の領域割当・開放装置にも、統計情報獲得の
コ−ドを付け加えたルーチンを作成することになる。例
えば、GC境界が使用できない等の理由で、既存の装置
を使う場合の割当量も知る必要があるときである。この
場合を除いて、本発明のごみ集めアタッチメントは、応
用プログラムの既存の装置を使用する部分の効率を下げ
ることはない。
【0056】応用プログラムからGC用の領域割り当て
要求があった場合は、本発明のごみ集めアタッチメント
で作成された新規の領域割当ルーチンは、GCに関する
若干の制御情報を処理した後、制御情報部分を含めた大
きさの領域について既存の動的記憶領域管理装置に割り
当てを依頼する。もしこの割り当てが失敗、あるいは成
功しても残り領域が少ないときには、GC装置を起動
し、現在GC用に割り当てられている領域の内、実際に
は不必要になっている領域を探索し開放する。
【0057】GC用の領域が明示的に開放要求された場
合はGCに関する情報の処理を行なった後、既存動的記
憶領域管理装置へ領域開放を依頼する。このようにし
て、本発明のごみ集めアタッチメントは、応用プログラ
ムから自然な方法によってGCを持った領域割当・開放
を実現する。
【0058】
【発明の実施の形態】以下、実施の形態に従って本発明
を詳細に説明する。図6及び図7に、図1に図示した領
域割当部10の実行する処理フローの一実施例、図8
に、図1に図示した領域開放部13の実行する処理フロ
ーの一実施例、図9ないし図12に、図1に図示したG
C処理部12の実行する処理フローの一実施例を図示す
る。
【0059】ここで、これらの処理フローを実現するプ
ログラムは、媒体から提供され、本発明のGCアタッチ
メント装置1に格納され、メモリ上で動作することで本
発明を実現することになる。
【0060】次に、これらの処理フローに従って、本発
明のGCアタッチメント装置1の動作処理について詳細
に説明する。先ず最初に、領域割当部10の実行する処
理について説明する。
【0061】領域割当部10は、応用プログラム3から
仮想ヒープ領域内の記憶領域の割当要求が発行される
と、図6及び図7の処理フローに示すように、先ず最初
に、割当要求のある記憶領域のサイズと、その記憶領域
の制御情報を格納するために用意する制御情報格納域の
サイズとの合計値を算出する。例えば、4バイト(1
語)の制御情報格納域を用意するときには、割当要求の
ある記憶領域のサイズにこの4バイトを加算し、語の大
きさで切り上げることで全体サイズを算出する。
【0062】ここで、仮想ヒープ領域とは、本来のヒー
プ領域の中に設定されて、GC処理の対象となる領域を
言う。従って、仮想ヒープ領域以外のヒープ領域は、G
C処理の対象とならない。
【0063】続いて、ステップ2で、ステップ1で算出
した全体サイズを指定して、既存動的記憶領域管理装置
2に記憶領域の割り当て依頼を発行する。続いて、ステ
ップ3で、既存動的記憶領域管理装置2による割り当て
が成功したのか否かを判断して、割り当てに成功したこ
とを判断するときには、ステップ4に進んで、仮想ヒー
プ領域内での割り当てであるのか否かをチェックする。
【0064】このようにして、仮想ヒープ領域内に、応
用プログラム3の要求する記憶領域を獲得していくこと
になるが、本発明では、図13に示すように、応用プロ
グラム3の要求する記憶領域に加えて、その先頭位置に
4バイトの長さを持つ制御情報格納域を獲得していくこ
とになる。
【0065】ステップ4で、応用プログラム3の要求す
る記憶領域を仮想ヒープ領域内に獲得したことを判断す
ると、続いて、ステップ5に進んで、その割り当てた記
憶領域の番地がGC境界を超えたのか否かを判断して、
超えることを判断するときには、ステップ6に進んで、
GC処理部12を起動し、超えないことを判断するとき
には、このステップ6の処理を省略する。
【0066】すなわち、上述のファースト・フィット法
に従って、応用プログラム3に記憶領域に割り当ててい
くことで、図14に示すように、現在の仮想ヒープ領域
の最後がGC境界を超えることになるときには、GC処
理部12を起動し、一方、図15に示すように、現在の
仮想ヒープ領域の最後が未だGC境界を超えないときに
は、GC処理部12を起動しないように処理するのであ
る。
【0067】このGC境界は、固定の境界値として設定
されることもあるが、後述するように、GC処理による
記憶領域の回収率に応じて動的に変更されることもあ
る。更に、応用プログラム3は、記憶領域の割当要求/
開放要求を発行することで仮想ヒープ領域に残されてい
る割当可能な記憶領域を把握することが可能であること
から、応用プログラム3がGC境界値の変更を指示する
構成を採ることも可能である。
【0068】続いて、ステップ7で、ステップ2の処理
に従って獲得した制御情報格納域に、応用プログラム3
に割り当てた記憶領域の長さ情報を格納するとともに、
その制御情報格納域の先頭に設けられるマークビット
(図13に示すもの)をOFFする。このマークビット
については、GC処理部12の処理の所で詳細に説明す
る。
【0069】続いて、ステップ8で、応用プログラム3
に割り当てた記憶領域に対応付けられる割当ビット(正
確には、その記憶領域の先頭に位置する制御情報格納域
に対応付けられる割当ビット)が存在するのか否かを判
断する。本発明のGCアタッチメント装置1では、図1
4及び図15に示すように、仮想ヒープ領域の1語に対
応付けて1ビットを持つ割当ビットの列からなる割当ビ
ットベクトル20を使って、応用プログラム3に割り当
てた記憶領域であるのか否かを管理する構成を採ってい
る。そして、この割当ビットベクトル20をブロックで
構成するとともに、そのブロックを動的に生成する構成
を採っている。
【0070】これから、応用プログラム3に記憶領域を
割り当てると、このステップ8で、その割り当てた記憶
領域に対応付けられる割当ビット(正確には、その記憶
領域の先頭に位置する制御情報格納域に対応付けられる
割当ビット)が既に生成されているのか否かを判断する
のである。
【0071】ステップ8で、応用プログラム3に割り当
てた記憶領域に対応付けられる割当ビットが生成されて
いないことを判断するときには、ステップ9に進んで、
既存動的記憶領域管理装置2に対して割当ビットベクト
ル20のブロックの生成を依頼し、続くステップ10
で、このブロックの生成に成功したのか否かを判断し
て、成功することを判断するときには、ステップ11に
進んで、この生成された割当ビットベクトル20の内
の、応用プログラム3に割り当てた記憶領域の先頭に位
置する制御情報格納域に対応付けられる割当ビットをO
Nする。
【0072】そして、ステップ8で、応用プログラム3
に対応付けられる割当ビットが生成されていることを判
断するときには、直ちに、ステップ11に進んで、応用
プログラム3に割り当てた記憶領域の先頭に位置する制
御情報格納域に対応付けられる割当ビットをONする。
【0073】一方、ステップ3で、既存動的記憶領域管
理装置2による割り当てが成功しないことを判断すると
きには、ステップ12に進んで、GC処理部12を起動
することで空きの記憶領域を生成する。このときのGC
処理部12の処理については後述する。
【0074】続いて、ステップ13で、ステップ1で算
出した全体サイズを指定して、既存動的記憶領域管理装
置2に記憶領域の割り当て依頼を発行する。続いて、ス
テップ14で、既存動的記憶領域管理装置2による割り
当てが成功したのか否かを判断して、割り当てに成功し
ないことを判断するときには、応用プログラム3に対し
て割り当てる記憶領域が存在しない旨を通知する。一
方、割り当てに成功したことを判断するときには、ステ
ップ15に進んで、仮想ヒープ領域内に獲得したのか否
かを判断して、仮想ヒープ領域内に獲得したことを判断
するときには、ステップ7に進んで、ステップ7ないし
ステップ11の処理を実行する。
【0075】なお、ステップ4及びステップ15で、仮
想ヒープ領域内の獲得できないことを判断するときと、
ステップ10で、割当ビットベクトル20のブロックの
生成に失敗することを判断するときには、応用プログラ
ム3に記憶領域を割り当てることができるものの、GC
対象外となることになる。
【0076】このように、領域割当部10は、応用プロ
グラム3から仮想ヒープ領域内の記憶領域の割当要求が
発行されると、図16に示すように、既存動的記憶領域
管理装置2を起動することで、応用プログラム3に記憶
領域を割り当てていくとともに、その記憶領域の先頭位
置に制御情報格納域を獲得して、その制御情報格納域に
その記憶領域の長さ情報を記録するとともに、その制御
情報格納域の先頭域に設けられるマークビット(図13
に示すもの)をOFFにし、更に、ブロック構成の割当
ビットベクトル20を動的に生成しながら、応用プログ
ラム3に割り当てた記憶領域の先頭に位置する制御情報
格納域に対応付けられる割当ビット(図中のα)をON
していくように処理するのである。なお、図16中に示
す30は、割当ビットベクトル20のブロックの先頭位
置を管理する割当ビットベクトル管理表である。
【0077】次に、領域開放部13の実行する処理につ
いて説明する。領域開放部13は、応用プログラム3か
ら記憶領域の明示的な開放要求が発行されるときと、後
述するようにGC処理部13から記憶領域の開放要求が
発行されると、図8の処理フローに示すように、先ず最
初に、ステップ1で、開放要求の記憶領域が仮想ヒープ
領域内のものであるのか否かを判断して、仮想ヒープ領
域内のものであることを判断するときには、ステップ2
に進んで、その開放要求の記憶領域に対応付けられる割
当ビット(正確には、その記憶領域の先頭に位置する制
御情報格納域に対応付けられる割当ビット)が存在する
のか否かをチェックする。
【0078】ステップ2で、開放要求の記憶領域に対応
付けられる割当ビットが存在することを判断するときに
は、ステップ3に進んで、割当ビットベクトル20の内
の、開放要求の記憶領域の先頭に位置する制御情報格納
域に対応付けられる割当ビットをOFFにしてから、続
くステップ4で、既存動的記憶領域管理装置2に対し
て、応用プログラム3から指定される記憶領域を指定し
て開放要求を発行することで、その記憶領域を開放す
る。
【0079】一方、ステップ1で、開放要求の記憶領域
が仮想ヒープ領域内のものでないことを判断するとき
と、ステップ2で、開放要求の記憶領域に対応付けられ
る割当ビットベクトル20が存在しないことを判断する
ときには、GC対象外となるので、直ちにステップ4に
進んで、既存動的記憶領域管理装置2に対して、応用プ
ログラム3から指定される記憶領域を指定して開放要求
を発行することで、その記憶領域を開放する。
【0080】このように、領域開放部13は、応用プロ
グラム3から記憶領域の明示的な開放要求が発行される
ときと、後述するようにGC処理部13から記憶領域の
開放要求が発行されるときに、既存動的記憶領域管理装
置2を起動することで、その記憶領域を開放していくと
ともに、その開放した記憶領域の先頭に位置する制御情
報格納域に対応付けられる割当ビットをOFFしていく
ように処理するのである。更に、領域開放部13は、こ
の処理の他に、領域割当部10による記憶領域の割り当
てが不可能なときに、既存動的記憶領域管理装置2を起
動することで、未割当を表示する割当ビットベクトル2
0のブロックを開放することで、応用プログラム3に割
り当てる記憶領域を確保する処理を行うことがある。
【0081】次に、GC処理部12の実行する処理につ
いて説明する。ここで、このGC処理部12の処理は、
大きく分けて、回収対象の記憶領域であるのか否かをマ
ークキングするマークキング処理と、マークキング処理
の処理結果を使って記憶領域の開放処理を実行する掃出
処理とで構成されている。
【0082】GC処理部12は、上述した領域割当部1
0の処理に従って起動されると、図9ないし図11の処
理フローに示すように、先ず最初に、ステップ1で、現
在の実行スタックの位置を変数Cに代入する。すなわ
ち、図14や図15に示すように、メモリの最終領域に
設けられるスタックの実行位置は、応用プログラム3の
データ処理の進行に伴って変動するので、このステップ
1では、現在の実行スタックの位置を変数Cに代入する
ことで、現在の実行スタックの位置を把握するのであ
る。
【0083】続いて、ステップ2で、機械依存処理を実
行する。この機械依存処理については後述する。続い
て、ステップ3で、静的領域の先頭番地を変数Rに代入
する。すなわち、図14や図15に示すように、メモリ
には、仮想ヒープ領域を指すポインタを展開する応用プ
ログラム3の静的領域(コード/データ領域)が存在す
るので、その静的領域の先頭番地を変数Rに代入するの
である。以下、静的領域に展開されるポインタの位置
は、Aバイトの整数倍の番地に境界合わせされているこ
とを想定するので、この変数Rに代入する静的領域の先
頭番地は、Aバイト単位で切り上げられることになる。
なお、この境界合わせがされてないときには「A=1」
となる。
【0084】続いて、ステップ4で、変数Rの値が静的
領域の最後まで到達したのか否かを判断して、未到達を
判断するときには、ステップ5に進んで、変数Rの値を
根としてポインタを辿るマーキング処理(後述する)を
行い、続くステップ6で、変数Rの値をAバイトだけイ
ンクリメントしてからステップ4に戻っていく。
【0085】一方、ステップ4で、変数Rの値が静的領
域の最後まで到達したことを判断するときには、ステッ
プ7に進んで、変数Cに格納される現在の実行スタック
の位置を変数Rに代入する。続いて、ステップ8で、変
数Rの値が実行スタックの最後まで到達したのか否かを
判断して、未到達を判断するときには、ステップ9に進
んで、変数Rの値を根としてポインタを辿るマーキング
処理を行い、続くステップ10で、変数Rの値をAバイ
トだけインクリメントしてからステップ8に戻ってい
く。
【0086】このようにして、GC処理部12は、図9
の処理フローのステップ1ないしステップ10の処理に
従って、静的領域の全領域に対してマーキング処理を行
うとともに、スタックの全領域に対してマーキング処理
を行うのである。
【0087】GC処理部12は、図9の処理フローのス
テップ8で、変数Rの値が実行スタックの最後まで到達
したことを判断することで、静的領域及びスタック領域
に対するマーキング処理の終了を判断すると、続いて、
図10及び図11の処理フローの処理に入ることになる
が、この処理フローの説明に入る前に、図12の処理フ
ローに従って、マーキング処理の詳細について説明す
る。
【0088】このマーキング処理は、要するに、静的領
域及びスタック領域の中に、仮想ヒープ領域を指すポイ
ンタと見なせるものがあれば、それらの指す先をどんど
ん辿っていくことで、仮想ヒープ領域を指すポインタか
ら連なる割当ビット“1(ON)”を持つ記憶領域をリ
ストアップして、そのリストアップした記憶領域の先頭
に位置する制御情報格納域の持つマークビット(図13
に示すもの)をONしていく処理を行うものである。
【0089】すなわち、GC処理部12は、マーキング
処理に入ると、図12の処理フローに示すように、先ず
最初に、ステップaで、根として設定されたR番地の内
容を変数Xに代入する。続いて、ステップbで、変数X
のビットパターンが仮想ヒープ領域内を指すポインタと
見なせるのか否かを判断して、ポインタと見なせないこ
とを判断するときには、処理を終了する。
【0090】一方、ステップbで、変数Xのビットパタ
ーンが仮想ヒープ領域内を指すポインタと見なせること
を判断するときには、ステップcに進んで、ポインタと
見なした場合の参照先から、制御情報格納域のサイズで
ある1語を差し引くことで、その参照先の先頭に位置す
る制御情報格納域の番地を求めて変数Pに代入する。続
いて、ステップdで、変数Pに格納される番地に対応付
けられる割当ビットが存在して、その値が“1(O
N)”であるのか否かを判断して、“1”でないことを
判断するとき、すなわち、領域割当部10が応用プログ
ラム3に割り当てた記憶領域でないことを判断するとき
には、処理を終了する。
【0091】一方、ステップdで、変数Pに格納される
番地に対応付けられる割当ビットが存在して、その値が
“1(ON)”であることを判断するとき、すわわち、
領域割当部10が応用プログラム3に割り当てた記憶領
域であることを判断するときには、ステップeに進ん
で、変数Pに格納される番地の指す制御情報格納域の持
つマークビットが“1(ON)”であるのか否かを判断
して、“1”であることを判断するときには、これまで
の追跡処理によりリストアップ済みであるので、処理を
終了する。
【0092】一方、変数Pに格納される番地の指す制御
情報格納域の持つマークビットが“1(ON)”でない
ことを判断するときには、ステップfに進んで、このマ
ークビットを“1(ON)”にセットし、変数Lに制御
情報格納域のサイズを除いた参照先の記憶領域のサイズ
を代入し、変数Jに“1”を代入する。
【0093】続いて、ステップgで、変数Pの番地と変
数Jの語数とを加算した番地を求めて変数Qに代入し、
続くステップhで、変数Qの番地が参照先の記憶領域の
最終位置に到達したのか否かをチェックして、到達する
ことを判断するときには、処理を終了する。一方、未到
達を判断するときには、ステップiに進んで、変数Qの
番地を根に設定してマーキング処理を再帰的に実行し、
続くステップjで、変数Jの値を1つインクリントして
から、ステップ7に戻っていく。
【0094】このようにして、GC処理部12は、マー
キング処理に入ると、図17に示すように、静的領域及
びスタック領域の中で、仮想ヒープ領域を指すポインタ
と見なせるものがあれば、それらの指す先をどんどん辿
っていくことで、仮想ヒープ領域を指すポインタから連
なる割当ビット“1(ON)”を持つ記憶領域をリスト
アップして、そのリストアップした記憶領域の先頭に位
置する制御情報格納域の持つマークビットをONしてい
く処理を行うことになる。
【0095】再び、図9ないし図12の処理フローに話
を戻すならば、GC処理部12は、図9の処理フローの
ステップ8で、変数Rの値が実行スタックの最後まで到
達したことを判断することで、静的領域及びスタック領
域に対するマーキング処理の終了を判断すると、マーク
キング処理の処理結果を使って記憶領域の掃出処理に入
って、図10の処理フローのステップ11に進んで、割
当ビットベクトル20が存在するのか否かを判断して、
割当ビットベクトル20が存在することを判断するとき
には、ステップ12に進んで、存在する最初の割当ビッ
トベクトル20のブロックの識別子を変数Vに代入す
る。
【0096】続いて、ステップ13で、変数Vの指す割
当ビットベクトル20のブロックの全割当ビットが全て
“0”であるのか否かを判断して、全て“0”でないこ
とを判断するとき、すなわち、応用プログラム20に割
り当てた記憶領域が存在することを判断するときには、
ステップ14に進んで、変数Vの指す割当ビットベクト
ル20のブロックの持つ最初に“1”を示す割当ビット
の位置を変数Bに代入する。
【0097】続いて、ステップ15で、変数Bの指す割
当ビットに対応付けられる仮想ヒープ領域の位置を変数
Rに代入し、続くステップ16で、変数Rの指す記憶領
域(制御情報格納域)の持つマークビットに“1”がセ
ットされているのか否かをチェックして、“1”がセッ
トされていることを判断するとき、すなわち、マーキン
グ処理に従って、応用プログラム3のポインタと見なせ
るものから指されていることで、応用プログラム3が参
照中の可能性のある記憶領域であると判断するときに
は、ステップ17に進んで、その記憶領域の開放指示を
発行せずに、そのマークビットを“0”にリセットす
る。このリセット処理は、次のマーキング処理の準備の
ために行っている。
【0098】一方、ステップ16で、変数Rの指す記憶
領域の持つマークビットに“1”がセットされていない
ことを判断するとき、すなわち、マーキング処理に従っ
て、応用プログラム3のポインタと見なせるものから指
されていないことで、応用プログラム3が参照中の可能
性のない記憶領域であると判断するときには、ステップ
18に進んで、領域開放部13を介し既存動的記憶領域
管理装置2に対して、変数Rの指す記憶領域から始まる
記憶領域(その記憶領域の長さは、変数Rの指す記憶領
域(制御情報格納域)に記録されている)の開放を指示
することで、その記憶領域を開放する。
【0099】ステップ17/ステップ18の処理を終了
すると、続いて、ステップ19に進んで、変数Bの指す
割当ビットに続く割当ビットに“1”を示すものが存在
するのか否かをチェックして、存在することを判断する
ときには、ステップ20に進んで、その割当ビットの位
置を変数Bに代入してから、ステップ15に戻っていく
ことで、同一ブロックに存在する“1”を示す別の割当
ビットに対する処理に入る。
【0100】一方、ステップ13で、変数Vの指す割当
ビットベクトル20のブロックの全割当ビットが全て
“0”であることを判断するときと、ステップ19で、
変数Bの指す割当ビットに続く割当ビットに“1”を示
すものが存在しないことを判断するときには、ステップ
21(図11の処理フロー)に進んで、変数Vの指す割
当ビットベクトル20のブロックが最終ブロックである
のか否かをチェックして、最終ブロックでないことを判
断するときには、ステップ22に進んで、次の割当ビッ
トベクトル20のブロックの識別子を変数Vに代入して
から、ステップ13に戻っていくことで、次のブロック
の処理に入る。
【0101】一方、ステップ21で、変数Vの指す割当
ビットベクトル20のブロックが最終ブロックであるこ
とを判断するときには、ステップ23に進んで、GC処
理を行ったことによる記憶領域の回収率を求めて、その
回収率が不良であるのか否かをチェックし、不良である
ことを判断するときには、また直ぐに領域割当部10か
ら呼び出される可能性が高いことを考慮して、ステップ
24に進んで、GC境界が大きな番地になるようにと拡
大してから、処理を終了する。
【0102】そして、ステップ11(図10の処理フロ
ー)で、割当ビットベクトル20が存在しないことを判
断するときにも、応用プログラム3に割り当てることが
可能な記憶領域が少ない状態にあることで、また直ぐに
領域割当部10から呼び出される可能性が高いことを考
慮して、ステップ24に進んで、GC境界が大きな番地
になるようにと拡大してから、処理を終了する。
【0103】一方、ステップ23で、GC処理に行った
ことによる記憶領域の回収率が良好であることを判断す
るときには、GC境界の変更処理を行うことなく処理を
終了する。
【0104】このように、GC処理部12は、領域割当
部10から呼び出されると、先ず最初に、マーキング処
理に入って、静的領域及びスタック領域の中で、仮想ヒ
ープ領域を指すポインタと見なせるものがあれば、それ
らの指す先をどんどん辿っていくことで、仮想ヒープ領
域を指すポインタから連なる割当ビット“1”を持つ記
憶領域をリストアップして、そのリストアップした記憶
領域の先頭に位置する制御情報格納域の持つマークビッ
トを“1”にセットする。続いて、そのマーキング処理
の処理結果を使って記憶領域の掃出処理に入って、割当
ビット“1”を持つとともに、マークビット“0”を持
つ記憶領域を検索して、既存動的記憶領域管理装置2に
対して、それらの記憶領域の開放を指示することで、そ
れらの記憶領域を回収する。
【0105】次に、本発明の実施例について更に詳述す
る。 〔1ー1〕概要 上述した本発明のGCアタッチメント装置1は、C言語
やC++言語などの、通常、GCを行なわない動的記憶
領域管理装置を内蔵する言語処理系に対して、ライブラ
リとしてGC機能を付加するごみ集めアタッチメント装
置である。
【0106】応用プログラム3は、(1)GCアタッチ
メント装置1の初期化ルーチンを呼ぶことと、(2)ご
み集めを必要とする領域の割り当てを行なったら、常に
その先頭を指すポインタが存在しているようにプログラ
ムするだけでGCを使用することができる。
【0107】別の言葉で言えば、本発明のGCアタッチ
メント装置1は、領域の先頭が応用プログラム3から直
接・間接に参照されているか否かによって、その領域の
用・不用を判定する。ここで、ある領域に「間接的」に
参照があるとは、直接応用プログラム3からその領域の
先頭へのポインタがなくても、先頭へのポインタが存在
している他の使用中の領域の内部にポインタがあって、
そのポインタが当該領域の先頭を指しているような場合
である。もちろん、この領域内部からのポインタの結合
は何重にも連なっていてもよい。応用プログラム3のど
こかから始まり、参照先が領域の先頭であるようなポイ
ンタを辿って行きつける領域はすべて使用中とするわけ
である。
【0108】本実施例では、既存動的記憶領域管理装置
2が、ヒープ領域をメモリ内のどの範囲に設定するかを
ある程度推定して、おおよその範囲をパラメータとして
あらかじめ設定する。より具体的には、本実施例の説明
では、既存動的記憶領域管理装置2は、プログラムの静
的領域(コード領域/データ領域)の直後部分からヒー
プ領域を設定し、実行中に必要があれば後方へ拡大して
ゆく場合を想定している。
【0109】本実施例では、ヒープ領域の先頭を推定し
た後、将来の拡大を見越してGCが必要な領域のための
ヒープ部分を定めるための仮想的なヒープ領域をパラメ
ータとして設定する。既存動的記憶領域管理装置2が、
この条件に満たない場合でも多くの場合は仮想ヒープ領
域の概念を変えることで適用可能である。
【0110】本実施例では、ポインタの判定を保守的手
法と呼ばれる方法で行なう。すなわち、応用プログラム
3から何らの情報も要求せず、語のビットパターンが正
当なポインタと見なせる形をしているものは、すべてポ
インタであると仮定して処理を行なう。「保守的(コン
サーバティプ)」という言葉は、例えば、1つの数値デ
ータが偶然にある正当なポインタと同じビットパターン
をしていた場合でもポインタと見なすために、「ごみか
どうか分からないものは捨てないでおく」という意味で
安全に動作することを示している。 〔1ー1ー1〕作成条件 本実施例では、説明を簡単にするために、既存動的記憶
領域管理装置2は、1語(4バイト)に境界合わせさ
れた領域を割り当てる機能があり、割り当て要求があ
った場合、ヒープ領域の先頭から順に割り当て可能な連
続領域を探すファースト・フィット法を用いており、
ヒープ領域は実行中に必要になった場合に番地の大きい
方へ拡大してゆく方法を採っており、割り当てが失敗
しても、その後不用領域を十分開放すればまた割り当て
が可能になる、という条件を満たすことを想定してい
る。
【0111】既存動的記憶領域管理装置2に、の境界
合わせの機能がない場合には、GCアタッチメント装置
1は、既存動的記憶領域管理装置2に1語分大きな領域
を要求して、語境界に沿って切り出す等の対処をするこ
とになる。
【0112】また、の条件が満たされない場合は、G
C境界は使用できないので代替手段を用意する。例え
ば、既存動的記憶領域管理装置2がGC境界のうまく機
能しない方式である場合には、GCアタッチメント装置
1は、割り当てに失敗した時点でGCを起動するか、あ
るいは、割り当てと開放の都度、その大きさを監視して
おいて、割当量が適当に設定された限界より多くなった
時点、すなわち、割当可能な領域が少なくなった時点に
GCを起動するなどの方法を使う。
【0113】また、の条件は、必ずしも満たされなく
てもGCアタッチメント装置1は正常に動作する。ま
た、の条件は、仮定はするものの、可能な限り割り当
てが失敗する状況に陥らないように工夫をすることが好
ましい。理由は、言語の動的記憶領域管理装置は、プロ
グラムで明示的に示した以外に、言語処理や翻訳後のコ
−ド内で隠れた呼び出しが存在したり、割り当てを使い
過ぎると実行スタックを圧迫したりなどの事情があり、
ヒープ領域を使い切ることは危険だからである。
【0114】また、一般に、このGCアタッチメント装
置1を作成する条件として、実際に存在するヒープ領域
範囲外を指すポインタが計算中に出ることがあるので、
GCアタッチメント装置1自身を作成するときは、アク
セス禁止割り込みにかからないようプログラミングを行
なう必要がある。
【0115】更に、領域の利用者使用部分の先頭を指す
大域変数ポインタ・静的変数ポインタを使用しないよう
にしなければならない。 〔1ー1ー1〕構成 図1に示したように、本発明のGCアタッチメント装置
1は、領域割当部10と、領域開放部13と、GC処理
部12と、割当ビットベクトル管理部11と、それらを
制御する制御部14とからなる。
【0116】これら全体は既存動的記憶領域管理装置2
と結合して機能し、応用プログラム3からの要求に従っ
て動作を起こす。 領域割当部10 領域割当部10は、応用プログラム3からの領域割り当
て要求を受けとり、GCに関する情報記憶処理を行なっ
た後、それを既存記憶領域管理装置2へ受け渡す。も
し、空き領域が少ない、あるいは無いことが分かったな
らば、GC処理部12を起動する。
【0117】領域開放部13 領域開放部13は、応用プログラム3及びGC処理部1
2からの領域開放要求に従って、応用プログラム3から
渡された不用領域を、若干の処理を行なった後、既存動
的記憶領域管理装置2を通して開放する。
【0118】GC処理部12 GC処理部12は、空き領域が少なくなった、あるいは
無くなった場合に呼び出される。呼び出されると、すで
に応用プログラム3内に割り当てられた領域のうち、不
用になった領域を自動的に探索し、領域開放部13を通
してそれらの不用領域を開放する。
【0119】GC処理部12は、マーキング処理と掃出
処理という2つの処理を行う。マーキング処理では、割
り当てた領域のうち、応用プログラム3から直接・間接
にポインタによって参照されている領域をすべて探索
し、印を付ける。その結果、印が付いていない領域は応
用プログラムからはアクセス不能であることがわかるの
で、それらが不用領域であることが確定する。掃出処理
では、印のついていない領域を順次、領域開放部13を
通して開放する。
【0120】割当ビットベクトル管理部11 GCを行なうためには、各実行時点で、どの領域が割り
当てられているか管理する必要がある。本実施例ではフ
レキシブルな割当ビットベクトル20を使用する。この
フレキシブルという言葉は、割当ビットベクトル20を
いくつかのグループ(ブロック)に分け、できるだけ実
際にGCが必要な割り当てが起こった部分のグループの
みに、対応する割当ビットベクトル20の部分を生成す
る方法を意味するものとする。
【0121】制御部14 各部分の初期化とパラメータ設定と、必要ならばパラメ
ータの実行時変更を行なう。この制御部14では、初期
化の段階で、応用プログラム3と結合・ロードされたデ
ータ領域の番地の範囲と、ヒープ領域の先頭番地(おお
よそで構わない)と、実行スタックの底の番地を調べて
おく。これらの値は、多くのシステムでマクロや特殊変
数などから得ることが可能である。実行スタックの底の
おおよその番地は主ルーチンの局所変数の番地などでも
推定可能である。その他のパラメータの設定や実行中の
変更は、特別の技術を必要とするものではなく、発明の
本質とは関連が薄いので省略する。
【0122】次に、データ構造と各モジュール部分の説
明を行なう。 〔1ー3〕データ構造 〔1ー3ー1〕ヒープ領域管理 図14と図15に、本発明のGCアタッチメント装置1
がどのようにヒープ領域を管理するのかの概念を示して
ある。この2つの図は、ヒープ領域の最後の番地以外は
同じ図である。
【0123】本発明のGCアタッチメント装置1は、ヒ
ープ領域の先頭からあらかじめ定めた大きさの範囲をG
Cの対象として設定する。この範囲を仮想ヒープ領域と
呼ぶ。万一、仮想ヒープ領域の外で割り当てが行なわれ
た場合は、GCの対象から外される。
【0124】仮想ヒープ領域は、いくつかのグループ
(ブロック)に等分され、各グループ毎に、1語(4バ
イト)当たり1ビットの割当ビットの列により構成され
る割当ビットベクトル20を使って割当状態を管理す
る。但し、割当ビットベクトル20は、必要になった時
点でヒープ領域から生成する。また、空き領域が極端に
不足した極限状態では、最後の手段として、すべてのビ
ットが“0”であるような割当ビットベクトル20のブ
ロックをヒープ領域へ返す処理を行う。
【0125】ヒープ領域と割当ビットベクトル20をグ
ループ分けする理由は、以下の2つの状況によって、で
きる限り必要な部分の割当ビットベクトル20の部分の
みを生成したいからである。
【0126】既存動的記憶管理装置2がヒープ領域を
実行中に拡大する性質のものである場合、その時点時点
で、実際に存在するヒープ領域の部分に対応する割当ビ
ットベクトル20のみを生成する。
【0127】応用プログラム3がGCを必要とする領
域割当要求頻度が少ない場合、実際に要求された部分に
かかわる割当ビットベクトル20のみを生成する。この
場合、割当ビットベクトル20のブロックの適切な大き
さは、応用プログラム3の性質によって違ってくる。す
なわち、領域割り当て要求のうち、GCが必要な領域の
割合が高ければ高い程、ブロックの大きさは大きい方が
よい。従って、仮想ヒープ領域の大きさや、グループの
大きさや個数は、変えられるようにすることが望まし
い。
【0128】なお、本実施例の前提では生じないことだ
が、既存動的記憶領域管理装置2の方式や機械のアーキ
テクチャによっては、それらの制限により、ヒープ領域
が連続領域とならない場合が起こり、そのような場合
に、実際に存在するヒープ領域の部分に対応する割当ビ
ットベクトル20のみを生成することも考えられる。こ
の場合でも、不連続があっても全体の番地がある範囲内
に収まるのであれば本実施例を使用できる。なお、ヒー
プ領域があまりに大きく飛び飛びに存在する場合は、仮
想ヒープ領域を複数にする必要が出る。
【0129】また、GCを行なうタイミングをはかるた
めに、仮想ヒープ領域の適当な位置にGC起動境界番地
を設定する。GC起動境界の前位置で割り当てが起こっ
た場合はGCは起動せず、後ろの位置で割り当てが起こ
った場合はGCが起動されることになる。
【0130】このGC起動境界位置は実行中に変更可能
である。例えば、GCを起動した結果の回収率が甚だし
く悪い場合は、GC起動境界番地を大きくするとスムー
ズに動作する。
【0131】最初の段階では、ヒープ領域は、おそらく
仮想ヒープ領域より小さいであろう。更に、最初はおそ
らく、GC起動境界より実際のヒープ領域最後の位置が
前にあるであろう。この状態では、実際のヒープ領域の
最後位置がGC起動境界を追い越すまではGCは起動さ
れない。実際のヒープ領域の最後位置がGC起動境界を
追い越した場合は、GC起動境界より後の位置でGCを
必要とする領域割り当てが起こったときに、GCが起動
されることになる。なお、実際のヒープ領域が仮想ヒー
プ領域より範囲が大きくなった場合でも、GCの対象と
なる領域は仮想ヒープ領域の範囲内のものである。 〔1ー3ー2〕領域の構造 領域割当部10により獲得される記憶領域は、図13に
示すように、領域の先頭1語を制御情報格納域として、
その直後以降を応用プログラム3が使用する領域とす
る。
【0132】この制御情報格納域は、1ビットのマーク
ビットと、応用プログラム3が使用する領域の長さ(語
単位)を持つものとする。このマークビットは、GCが
起動されたとき、使用中の領域に“1”がセットされる
ものとして予約される。また、この長さは、制御情報格
納域を除いたサイズを意味することとする。
【0133】その他の制御情報が必要な場合には、この
制御情報格納域に設定することになるが、本発明では話
を簡単にするために、制御情報はマークビットと領域の
長さ情報の2つのみとする。 〔1ー4〕各モジュールの説明 〔1ー4ー1〕割当ビットベクトル管理部11 割当ビットベクトル管理部11は、以下のような状況を
管理する。
【0134】すなわち、図16に示したように、割当ビ
ットベクトル20は、割当ビットベクトル管理表30に
よってグループ(ブロック)の順番に沿って管理され
る。存在しない割当ビットベクトル20のブロックに対
する割当ビットベクトル管理表30の位置には、空値が
設定される。
【0135】各割当ビットは、対応するヒープ領域の1
つの語に対し、1ビットとして、番地計算により対応が
付けられている。GCを必要とする領域がヒープ領域か
ら割り当てられると、その先頭の制御情報格納域の位置
に対する割当ビットがONになる。
【0136】実行が進むにつれて、GCを必要とする領
域割り当てが、割当ビットベクトル20の存在しない部
分に起こった場合には、その都度、割当ビットベクトル
20が生成されることになる。 〔1ー4ー2〕領域割当部10 領域割当部10は、応用プログラム3から割り当て要求
があると、図6及び図7に示す処理フローの処理を実行
する。
【0137】この領域割当部10は、応用プログラム3
から領域割り当ての要求があった場合、先ず最初に、本
発明のGCアタッチメント装置1が使用する制御情報格
納域の分を加えた全体サイズ(語の大きさ単位で切り上
げ)を算出し、その大きさの領域を、語境界に合わせた
番地で得られるよう既存動的記憶領域管理装置2に割り
当て依頼を行なう。
【0138】そして、もし割り当てが失敗したならばG
C処理部12を起動させ、不用領域の回収を試みた後、
もう一度、既存動的記憶領域管理装置2を起動すること
で領域確保を試みる。それでも失敗したならば、割当ビ
ットベクトル20の中で、すべてが“0”であるような
ブロックを開放してから、もう一度割り当てを試みる。
それでも失敗したならば、割り当ては失敗として終了す
る。
【0139】割り当てが成功した場合は、それが仮想ヒ
ープ領域の範囲内かどうかを調べる。もし範囲外である
ならば、割り当て成功であるが、その領域はGCの対象
外となる。
【0140】また、もし、割り当てられた番地がGC起
動境界番地より後の部分であったならばGC処理部12
を起動する。但し、最初に既存動的記憶領域管理装置2
への割り当て要求が失敗した場合には、GC起動境界番
地に関係なく、GC処理部12を起動することになる。
【0141】割り当てが成功した後に、GCを行なうか
どうかを判定するところが、本装置のGC起動境界管理
の特徴である。以上が成功した場合は、領域の先頭に制
御情報格納域を設定し、割当ビットをONにする。もし
割当ビットベクトル20が存在しなければこの時点で生
成してから割当ビットをONに設定する。
【0142】最後に制御情報格納域に続く利用者使用部
分の番地を応用プログラム3に返して終了する。 〔1ー4ー3〕領域開放部13 領域開放部13は、応用プログラム3/GC処理部13
から開放要求があると、図8に示す処理フローの処理を
実行する。
【0143】この領域開放部13は、もし開放されるべ
き領域が仮想ヒープ領域の範囲内であるならば、対応す
る割当ビットをOFFにし(割当ビットベクトルが存在
しない場合は何もしない。これは、それ以前に領域割り
当てが成功したが割当ビットベクトルの生成には失敗し
たという極限状態で生じうる)、既存動的記憶領域管理
装置2に領域開放を依頼する。
【0144】仮想ヒープ領域の範囲外の場合は、単に既
存動的記憶領域管理装置2へ領域開放を依頼する。 〔1ー4ー4〕GC処理部12 GC処理部12は、ヒープ領域内に空きが少なくなった
か、ヒープ領域内に空きがなくなった場合に呼び出さ
れ、図9ないし図12の処理フローを実行することで、
応用プログラム3に割り当てられた領域の中で不用であ
るものを自動探索して回収する。
【0145】図9及び図12はマーキング処理を示し、
図10及び図11は掃出処理を示している。マーキング
処理を実行するマーク部は、応用プログラム3が直接・
間接に参照する全ての領域のマークビットを“1”にす
る。すなわち、最後までマークビットが“0”であった
領域は、応用プログラム3からの参照がないことにな
り、不用領域と見なすことができるわけである。
【0146】参照を調べるのは保守的方法を使用する。
すなわち、メモリ内の特定の語を見て、そのビットパタ
ーンを調べ、それが仮想ヒープ領域内の割当ビットが
“1”であるようなどれかの位置を指すようなポインタ
のビットパターンの形になっているときは、それは実際
にそこへのポインタであると推定する。
【0147】もちろん、誤認識の可能性(たまたま正当
なポインタと同じビットパターンを持つ数値データが生
じた場合など)はあるが、その可能性は非常に小さい。
また、誤認識が起こった場合でも、その誤りは本来不用
であるはずの領域に使用中の印をつけてしまう誤りであ
って、本来使用中の領域を間違って開放してしまう致命
的な誤りにはならない、その意味で安全に動作する。
【0148】マーク部は、先ず最初に、GC処理部12
が起動された時点での実行スタックの使用範囲を記憶し
ておき(GC処理部12が起動される直前の実行スタッ
クの使用範囲がわかると非常に良い。高級言語でこのよ
うな位置を調べるには、少々トリック的であるが、適当
なタイミングでダミーの局所変数を生成し、その番地を
調べるなどの方法がある)、静的領域と今調べた実行ス
タックの中から、仮想ヒープ領域へのポインタと見なせ
るものをしらみ潰しに探索して、直接・間接に参照され
ているすべての領域のマークビットを“1”にする。
【0149】続いて、機械依存処理を行う。これは、機
械によっては、プログラム内のポインタが実行のある時
点ではメモリ内部になくレジスタのどれかにあるのみで
ある可能性があるので、そのための処理を行なう部分で
ある。すなわち、そのような可能性のあるレジスタから
マーキング処理を行なったり、実行スタックからキャッ
シュが行なわれているレジスタ内容をフラッシュアウト
をするなどの処理を行う。この処理は機械・アーキテク
チャに依存する。
【0150】マーキング処理の概念については図17に
示した。この図に示すように、マーク部は、プログラム
の静的領域及び実行スタック領域から、GC必要領域と
して割り当てられた領域の内、利用者使用先頭位置、す
なわち制御情報格納域の直後を参照しているポインタ
(と見なせる語)が存在するもののマークビットを
“1”にする。更に、マークビットが“1”である領域
の内部にも、他の領域の利用者使用先頭位置へのポイン
タ(と見なせる)語が存在するならば、その参照領域も
すべてマークビットを“1”にする。このようにして、
プログラムから直接・間接に参照されている(と見なせ
る)領域のすべてのマークビットを“1”にした後、マ
ークビットが“0”である領域を不用領域として掃出処
理で回収する。
【0151】マーキング処理は、例えば、図12の処理
フローに示す再帰的なアルゴリズムに従って実行され
る。なお、より煩雑ではあるが、効率的なしらみ潰しの
探索アルゴリズムも種々知られているので、それらを使
用してもよい。
【0152】マーキング処理の性質により、本発明のG
Cアタッチメント装置1のプログラム自身の大域変数・
静的変数には、領域の利用者先頭位置を参照するポイン
タを含まないようにしなければならない。あるいは、そ
のようなポインタを必要とすることがあったならば、そ
の部分はマーキング処理の対象から外さなければならな
い。
【0153】本発明のGCアタッチメント装置1の局所
変数に関しては、そのような注意は必要ない。なぜなら
ば、本発明のGCアタッチメント装置1の局所変数は、
GC処理部12の先頭で調べたスタック範囲の外側で
(実行スタックが伸びて)操作されるため、マーキング
処理の対象から自動的に外されるからである。
【0154】掃出処理を実行する掃出部は、図10及び
図11の処理フローに従って、掃出処理を実行する。こ
の掃出部では、割当ビットベクトル20をすべて調べ、
ビットが“1”である位置に対応する仮想ヒープ領域の
語に関して以下のことを行なう。
【0155】もし、マークビットが“1”、すなわち使
用中であるならば、マークビットを“0”にクリアす
る。もし、マーク・ビットが“0”、すなわち不用領域
であるならば領域開放部13を呼び出してその領域を開
放する。
【0156】値が“1”である全ての割当ビットに対し
て上の処理が完了したら、GC処理部12は処理を終了
する。このGC終了時点で、マークビットはすべてクリ
アされることになる。
【0157】
【発明の効果】以上説明したように、本発明のGCアタ
ッチメント装置では、ヒープ領域以外の記憶領域から応
用プログラムにより直接的及び間接的に指されることに
なるヒープ領域内の記憶領域は、応用プログラムが使用
中であると見なす方法を用いる構成を採り、更に、記憶
領域の長さ情報を格納する制御情報格納域を付加する形
で、応用プログラムに割り当てる記憶領域を獲得すると
ともに、割当ビットベクトルを使って、応用プログラム
に割り当てた記憶領域であるのか否かを管理する構成を
採ることで、任意の長さを持つ記憶領域を応用プログラ
ムに割り当てることを可能にし、これにより応用プログ
ラム3とは独立した形のGC装置を実現できるようにな
る。
【0158】次に、本発明の効果について更に詳述す
る。本発明により、発明が解決しようとする課題は以下
のように解決される。 (1)手軽にGCを行なう手段を提供できるようになっ
た。
【0159】本発明は、通常の非常に小さなライブラリ
の1つにすぎず、これを使用したい応用プログラムはわ
ずかなルールに従って本発明のライブラリを呼び出すだ
けでGCを利用することができる。
【0160】特に、実施例で述べた、保守的方式を使用
した場合は、あたかも、通常の動的記憶領域割り当てと
同じ感覚で使用できる。 (2)部分的にGC付き動的記憶領域管理装置を使用で
きる。
【0161】応用プログラムは、将来領域が不用になっ
たときにその判定が困難となり得るものだけに本発明を
利用すればよい。従って応用プログラムの他の部分は、
統計情報をとる等のわずかなオーバーヘッドが必要とな
る場合を除いて、本発明の影響は全く受けず、GC装置
があるために効率が下がることはない。 (3)他のプログラムとの結合。
【0162】上述したように本発明は単なるライブラリ
にすぎず、ごみ集めアタッチメントが提供する領域は通
常の動的記憶領域管理装置で得られる領域とまったく同
様に使用できる。従って、応用プログラムは通常のプロ
グラムとまったく変わらず、応用プログラム自身が別の
ライブラリである場合も、他のプログラムに結合するこ
とは全く問題はない。
【0163】またGCを必要とする複数のソフトウエア
を結合する場合にも、ひとつのごみ集めアタッチメント
を、初期化を一ケ所のみで行なうことにするだけで全く
問題なく共有して使用できる。 (4)システムが小さい。
【0164】本発明は、GC部分の機能のみを1つの装
置としたものであるので、それだけコンパクトなシステ
ムとなる。本発明は、GC以外の動的記憶領域管理機能
については、プログラム言語、あるいはOSのものを使
用するので動的記憶領域管理装置の重なりがない分、よ
り小さなシステムとなる。
【0165】以上のことから、簡素な本発明の装置を付
加することにより、GCを行なわない既存の動的記憶領
域管理装置から、応用プログラムから独立で柔軟なGC
を含む動的記憶領域管理装置が得られる。それは、GC
に関係のない部分の時間効率をほとんど、あるいはまっ
たく低下させることなく実現される。
【0166】この発明により、通常のGCを持たない手
続き型言語において自然にGCを使うことができる。こ
れは、今までGCがないために困難であった処理を簡単
な方法で実行できるようにするため、新しい応用が開
け、ソフトウエアの適用範囲を広げることに寄与すると
ころが大きい。
【図面の簡単な説明】
【図1】本発明の原理構成図である。
【図2】本発明の原理構成図である。
【図3】本発明の原理構成図である。
【図4】本発明の原理構成図である。
【図5】本発明の原理構成図である。
【図6】領域割当部の実行する処理フローの一実施例で
ある。
【図7】領域割当部の実行する処理フローの一実施例で
ある。
【図8】領域開放部の実行する処理フローの一実施例で
ある。
【図9】GC処理部の実行する処理フローの一実施例で
ある。
【図10】GC処理部の実行する処理フローの一実施例
である。
【図11】GC処理部の実行する処理フローの一実施例
である。
【図12】GC処理部の実行する処理フローの一実施例
である。
【図13】獲得領域の説明図である。
【図14】ヒープ領域の割当管理の説明図である。
【図15】ヒープ領域の割当管理の説明図である。
【図16】割当ビットベクトルの説明図である。
【図17】マーキング処理の説明図である。
【符号の説明】
1 GCアタッチメント装置 2 既存動的記憶領域管理装置 3 応用プログラム 10 領域割当部 11 割当ビットベクトル管理部 12 GC処理部 13 領域開放部 14 制御部

Claims (12)

    【特許請求の範囲】
  1. 【請求項1】 既存の動的記憶領域管理装置とは別に設
    けられて、応用プログラムで不要となった記憶領域を回
    収するGCアタッチメント装置であって、 応用プログラムから処理対象となるヒープ領域内の記憶
    領域の割当要求が発行されるときに、上記動的記憶領域
    管理装置を起動することで、記憶領域の長さ情報を格納
    する制御情報格納域を付加する形で、該記憶領域を獲得
    するとともに、処理対象となるヒープ領域に対応付けて
    設けられる割当ビットのベクトルの内、該記憶領域の指
    す割当ビットを割当モードにセットする領域割当部と、 上記割当ビットベクトル及び上記制御情報格納域の長さ
    情報を参照することで、上記領域割当部により割り当て
    られた記憶領域を抽出しつつ、それらの記憶領域の内、
    ヒープ領域以外の記憶領域から応用プログラムにより直
    接的及び間接的に指されることになるものを特定して、
    上記動的記憶領域管理装置を起動することで、その特定
    した記憶領域以外の記憶領域を開放するとともに、その
    開放した記憶領域の指す割当ビットを未割当モードにリ
    セットするGC処理部と、 応用プログラムから記憶領域の開放要求が発行されると
    きに、上記動的記憶領域管理装置を起動することで、該
    記憶領域を開放するとともに、その開放した記憶領域の
    指す割当ビットを未割当モードにリセットする領域開放
    部とを備えることを、 特徴とするGCアタッチメント装置。
  2. 【請求項2】 請求項1記載のGCアタッチメント装置
    において、 GC処理部は、制御情報格納域に設けられる作業フラグ
    にマークを付けながら、記憶領域の追跡処理を実行する
    ことを、 特徴とするGCアタッチメント装置。
  3. 【請求項3】 請求項1又は2記載のGCアタッチメン
    ト装置において、 割当ビットベクトルは、複数のブロックを単位として構
    成されることを、 特徴とするGCアタッチメント装置。
  4. 【請求項4】 請求項3記載のGCアタッチメント装置
    において、 領域割当部は、動的記憶領域管理装置を起動すること
    で、割当ビットベクトルのブロックを動的に生成してい
    くことを、 特徴とするGCアタッチメント装置。
  5. 【請求項5】 請求項3又は4記載のGCアタッチメン
    ト装置において、 領域開放部は、動的記憶領域管理装置を起動すること
    で、未割当を表示する割当ビットベクトルのブロックを
    開放することを、 特徴とするGCアタッチメント装置。
  6. 【請求項6】 請求項1ないし5記載のGCアタッチメ
    ント装置において、 GC処理部は、領域割当部による記憶領域の割り当てが
    実行できないときに処理に入ることを、 特徴とするGCアタッチメント装置。
  7. 【請求項7】 請求項1ないし5記載のGCアタッチメ
    ント装置において、 GC処理部は、応用プログラムに割り当てることが可能
    な記憶領域が少なくなるときに処理に入ることを、 特徴とするGCアタッチメント装置。
  8. 【請求項8】 請求項7記載のGCアタッチメント装置
    において、 GC処理部は、領域割当部により割り当てられる記憶領
    域の番地が規定の境界値に到達するときに、応用プログ
    ラムに割り当てることが可能な記憶領域が少なくなった
    と判断して処理に入ることを、 特徴とするGCアタッチメント装置。
  9. 【請求項9】 請求項8記載のGCアタッチメント装置
    において、 GC処理部は、記憶領域の回収効率に応じて境界値を動
    的に変更することを、 特徴とするGCアタッチメント装置。
  10. 【請求項10】 請求項8記載のGCアタッチメント装
    置において、 GC処理部は、応用プログラムからの指示に応答して境
    界値を動的に変更することを、 特徴とするGCアタッチメント装置。
  11. 【請求項11】 請求項1ないし10記載のGCアタッ
    チメント装置において、 応用プログラムに応じて、処理対象となるヒープ領域が
    設定されるよう構成されることを、 特徴とするGCアタッチメント装置。
  12. 【請求項12】 既存の動的記憶領域管理装置とは別に
    設けられて、応用プログラムで不要となった記憶領域を
    回収するGCアタッチメント装置を実現するプログラム
    が記憶されるプログラム記憶媒体であって、 応用プログラムから処理対象となるヒープ領域内の記憶
    領域の割当要求が発行されるときに、上記動的記憶領域
    管理装置を起動することで、記憶領域の長さ情報を格納
    する制御情報格納域を付加する形で、該記憶領域を獲得
    するとともに、処理対象となるヒープ領域に対応付けて
    設けられる割当ビットのベクトルの内、該記憶領域の指
    す割当ビットを割当モードにセットする領域割当部と、 上記割当ビットベクトル及び上記制御情報格納域の長さ
    情報を参照することで、上記領域割当部により割り当て
    られた記憶領域を抽出しつつ、それらの記憶領域の内、
    ヒープ領域以外の記憶領域から応用プログラムにより直
    接的及び間接的に指されることになるものを特定して、
    上記動的記憶領域管理装置を起動することで、その特定
    した記憶領域以外の記憶領域を開放するとともに、その
    開放した記憶領域の指す割当ビットを未割当モードにリ
    セットするGC処理部と、 応用プログラムから記憶領域の開放要求が発行されると
    きに、上記動的記憶領域管理装置を起動することで、該
    記憶領域を開放するとともに、その開放した記憶領域の
    指す割当ビットを未割当モードにリセットする領域開放
    部とを実現するプログラムが記憶されることを、 特徴とするプログラム記憶媒体。
JP13176297A 1997-05-22 1997-05-22 Gcアタッチメント装置及びプログラム記憶媒体 Withdrawn JPH10320263A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP13176297A JPH10320263A (ja) 1997-05-22 1997-05-22 Gcアタッチメント装置及びプログラム記憶媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP13176297A JPH10320263A (ja) 1997-05-22 1997-05-22 Gcアタッチメント装置及びプログラム記憶媒体

Publications (1)

Publication Number Publication Date
JPH10320263A true JPH10320263A (ja) 1998-12-04

Family

ID=15065586

Family Applications (1)

Application Number Title Priority Date Filing Date
JP13176297A Withdrawn JPH10320263A (ja) 1997-05-22 1997-05-22 Gcアタッチメント装置及びプログラム記憶媒体

Country Status (1)

Country Link
JP (1) JPH10320263A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100384905B1 (ko) * 1999-04-23 2003-05-22 인터내셔널 비지네스 머신즈 코포레이션 컴퓨터 메모리에서 데이터 관리 방법, 장치 및 기록매체
KR20030094658A (ko) * 2002-06-07 2003-12-18 이승룡 자동화된 동적 메모리 관리 기반의 시스템 환경에서어플리케이션이 직접 동적 메모리를 관리하는 방법
US6766336B2 (en) 2000-01-28 2004-07-20 Matsushita Electric Industrial Co., Ltd Garbage collection apparatus and a garbage collection method
JP2014504768A (ja) * 2011-02-08 2014-02-24 インターナショナル・ビジネス・マシーンズ・コーポレーション 領域に基づくガベージ・コレクタを用いてクラスを漸進的にアンロードするための方法、コンピュータ・プログラム製品、および装置

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100384905B1 (ko) * 1999-04-23 2003-05-22 인터내셔널 비지네스 머신즈 코포레이션 컴퓨터 메모리에서 데이터 관리 방법, 장치 및 기록매체
US6766336B2 (en) 2000-01-28 2004-07-20 Matsushita Electric Industrial Co., Ltd Garbage collection apparatus and a garbage collection method
KR20030094658A (ko) * 2002-06-07 2003-12-18 이승룡 자동화된 동적 메모리 관리 기반의 시스템 환경에서어플리케이션이 직접 동적 메모리를 관리하는 방법
JP2014504768A (ja) * 2011-02-08 2014-02-24 インターナショナル・ビジネス・マシーンズ・コーポレーション 領域に基づくガベージ・コレクタを用いてクラスを漸進的にアンロードするための方法、コンピュータ・プログラム製品、および装置
US9870317B2 (en) 2011-02-08 2018-01-16 International Business Machines Corporation Incremental class unloading in a region-based garbage collector

Similar Documents

Publication Publication Date Title
US5321834A (en) Method and system for reclaiming unreferenced computer memory space
US6910213B1 (en) Program control apparatus and method and apparatus for memory allocation ensuring execution of a process exclusively and ensuring real time operation, without locking computer system
JP3628032B2 (ja) コンサーバティブ・スタックとジェネレイショナル・ヒープガーベージ・コレクション用コンピュータシステム及び方法
US5948113A (en) System and method for centrally handling runtime errors
JP3560535B2 (ja) ガーベッジ収集中に空き領域を検出し合体させる方法およびシステム
US5930807A (en) Apparatus and method for fast filtering read and write barrier operations in garbage collection system
US7010555B2 (en) System and method for compacting a computer system heap
US6226761B1 (en) Post dump garbage collection
US6839726B2 (en) Apparatus, method, and program for implementing garbage collection suitable for real-time processing
US20070011415A1 (en) Apparatus and method for deterministic garbage collection of a heap memory
US20060294167A1 (en) Method and system for dynamically managing storage of data objects generated during execution of a computer program
JP2002540503A (ja) メモリ再利用方法
US20030135658A1 (en) Single-instance class objects across multiple JVM processes in a real-time system
JPH03240127A (ja) プログラム制御システム
JPH1115726A (ja) コンピュータ制御方法、装置、システム、およびコンピュータプログラム製品
KR101004483B1 (ko) 불필요 데이터 수집시스템
US20100131803A1 (en) Computation of stack usage in embedded computing systems
US7676511B2 (en) Method and apparatus for reducing object pre-tenuring overhead in a generational garbage collector
JP2006172494A (ja) プログラム制御装置、プログラム制御方法、およびプログラム記録媒体
US8176286B2 (en) Memory recycling in computer systems
US7321908B2 (en) Mostly concurrent garbage collection
JPH10320263A (ja) Gcアタッチメント装置及びプログラム記憶媒体
US7617264B1 (en) Parallel remembered-set processing respecting popular-object detection
JP3826626B2 (ja) プログラム制御装置、プログラム制御方法、およびプログラム記録媒体
JPH10214203A (ja) 情報処理装置

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20040803