(57)【特許請求の範囲】
【請求項１】
データを記憶する記憶領域を複数有する記憶装置と、
データを識別するデータ識別子と、上記データ識別子によって識別されるデータを記憶した記憶領域を識別する記憶識別子との対応関係を、上記記憶装置の記憶領域に記憶する対応関係記憶部と、
データを識別するデータ識別子と、データを記憶した記憶領域を識別する記憶識別子とのいずれかを対象識別子として、上記記憶装置の記憶領域に記憶する対象識別子記憶部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを判断する対象識別子判断部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であると上記対象識別子判断部が判断した場合に、上記対応関係記憶部が上記記憶装置の記憶領域に記憶したデータ識別子と記憶識別子との対応関係に基づいて、上記対象識別子記憶部が記憶領域に記憶したデータ識別子に対応する記憶識別子を求める対象記憶領域算出部と、
上記対象記憶領域算出部が求めた記憶識別子によって記憶領域を識別し、識別した記憶領域が所定の記憶領域であるか否かを判断する対象記憶領域判断部と、
上記対象記憶領域判断部が識別した記憶領域が所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記対象識別子記憶部が対象識別子を記憶した記憶領域に、上記対象記憶領域算出部が求めた記憶領域識別子を記憶する対象識別子書換部と、
上記記憶装置の記憶領域がデータを記憶しているか否かを判断する空き領域判断部と、
データを記憶する記憶領域の確保を要求する領域確保要求を取得する領域確保要求取得部と、
上記領域確保要求取得部が上記領域確保要求を取得した場合に、データを記憶していないと上記空き領域判断部が判断した記憶領域を、上記データを記憶する記憶領域として確保し、確保した記憶領域を識別する記憶識別子を通知する領域確保部と、
上記領域確保要求取得部が領域確保要求を取得した場合に、上記領域確保部が確保する記憶領域が記憶するデータの種別を取得し、データ種別とする種別取得部と、
上記種別取得部が取得したデータ種別が所定のデータ種別であるか否かを判断する種別判断部と、
上記種別取得部が取得したデータ種別が上記所定のデータ種別であると上記種別判断部が判断した場合に、上記記憶領域のうち上記所定の記憶領域を上記領域確保部に確保させ、上記種別取得部が取得したデータ種別が所定のデータ種別ではないと上記種別判断部が判断した場合に、上記記憶領域のうち上記所定の記憶領域以外の記憶領域を上記領域確保部に確保させるデータ割振り部とを有することを特徴とする記憶管理装置。
【請求項２】
データを記憶する記憶領域を複数有する記憶装置と、
データを識別するデータ識別子と、上記データ識別子によって識別されるデータを記憶した記憶領域を識別する記憶識別子との対応関係を、上記記憶装置の記憶領域に記憶する対応関係記憶部と、
データを識別するデータ識別子と、データを記憶した記憶領域を識別する記憶識別子とのいずれかを対象識別子として、上記記憶装置の記憶領域に記憶する対象識別子記憶部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを判断する対象識別子判断部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であると上記対象識別子判断部が判断した場合に、上記対応関係記憶部が上記記憶装置の記憶領域に記憶したデータ識別子と記憶識別子との対応関係に基づいて、上記対象識別子記憶部が記憶領域に記憶したデータ識別子に対応する記憶識別子を求める対象記憶領域算出部と、
上記対象記憶領域算出部が求めた記憶識別子によって記憶領域を識別し、識別した記憶領域が所定の記憶領域であるか否かを判断する対象記憶領域判断部と、
上記対象記憶領域判断部が識別した記憶領域が所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記対象識別子記憶部が対象識別子を記憶した記憶領域に、上記対象記憶領域算出部が求めた記憶領域識別子を記憶する対象識別子書換部と、
上記記憶領域が記憶したデータの種別を判別してデータ種別とし、判別したデータ種別が所定のデータ種別であるか否かを判断する種別判断部と、
上記データを記憶した記憶領域が上記所定の記憶領域であるか否かを判断する領域判断部と、
上記記憶領域が記憶したデータの種別が所定のデータ種別であると上記種別判断部が判断し、かつ、上記データを記憶した記憶領域が上記所定の記憶領域でないと上記領域判断部が判断した場合に、上記記憶領域が記憶したデータを読み出し、読み出したデータを上記所定の記憶領域に記憶させ、上記記憶領域が記憶したデータの種別が上記所定のデータ種別でないと上記種別判断部が判断し、かつ、上記データを記憶した記憶領域が上記所定の記憶領域であると上記領域判断部が判断した場合に、上記記憶領域が記憶したデータを読み出し、読み出したデータを上記所定の記憶領域以外の記憶領域に記憶させるデータ移動部とを有することを特徴とする記憶管理装置。
【請求項３】
上記記憶管理装置は、更に、
上記記憶装置の記憶領域がデータを記憶しているか否かを判断する空き領域判断部と、
データを記憶する記憶領域の確保を要求する領域確保要求を取得する領域確保要求取得部と、
上記領域確保要求取得部が上記領域確保要求を取得した場合に、データを記憶していないと上記空き領域判断部が判断した記憶領域を、上記データを記憶する記憶領域として確保し、確保した記憶領域を識別する記憶識別子を通知する領域確保部と、
上記領域確保部が通知した記憶識別子を取得し、取得した記憶識別子を他の記憶領域に記憶させる記憶識別子記憶部と、
上記データ移動部がデータを読み出した記憶領域を識別する記憶識別子を記憶した記憶領域に、上記データ移動部がデータを記憶させた記憶領域を識別する記憶識別子を記憶する記憶識別子書換部とを有することを特徴とする請求項２に記載の記憶管理装置。
【請求項４】
上記記憶管理装置は、更に、
上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを区別する情報を、識別子情報として記憶領域に記憶する識別子情報記憶部と、
上記対象記憶領域判断部が識別した記憶領域が上記所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを区別する識別子情報を上記識別子情報記憶部が記憶した記憶領域に、上記対象識別子記憶部が記憶領域に記憶した対象識別子が記憶識別子であることを示す識別子情報を記憶する識別子情報書換部とを有し、
上記対象識別子判断部は、上記識別子情報記憶部が記憶領域に記憶した識別子情報に基づいて、上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを判断することを特徴とする請求項１乃至請求項３のいずれかに記載の記憶管理装置。
【請求項５】
上記記憶管理装置は、更に、
記憶識別子によって識別される記憶領域が記憶したデータの操作を指令する記憶操作指令識別子と、データ識別子によって識別されるデータの操作を指令するデータ操作指令識別子とのいずれかである操作指令識別子を記憶領域に記憶する操作指令記憶部と、
上記対象記憶領域判断部が識別した記憶領域が上記所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記操作指令記憶部が操作指令識別子を記憶した記憶領域に、上記記憶領域が記憶したデータ操作指令識別子と同一のデータの操作を指令する記憶操作指令識別子を記憶する操作指令書換部とを有し、
上記対象識別子判断部は、上記操作指令記憶部が記憶領域に記憶した操作指令識別子が記憶操作指令識別子であるかデータ操作指令識別子であるかを判断し、上記操作指令記憶部が記憶領域に記憶した操作指令識別子が記憶操作指令識別子であると判断した場合に、上記対象識別子記憶部が記憶領域に記憶した対象識別子が記憶識別子であると判断し、上記操作指令記憶部が記憶領域に記憶した操作指令識別子がデータ操作指令識別子であると判断した場合に、上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であると判断することを特徴とする請求項１乃至請求項３のいずれかに記載の記憶管理装置。
【請求項６】
データを記憶する記憶領域を複数有する記憶装置と、
データを識別するデータ識別子と、上記データ識別子によって識別されるデータを記憶した記憶領域を識別する記憶識別子との対応関係を、上記記憶装置の記憶領域に記憶する対応関係記憶部と、
データを識別するデータ識別子と、データを記憶した記憶領域を識別する記憶識別子とのいずれかを対象識別子として、上記記憶装置の記憶領域に記憶する対象識別子記憶部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であるか記憶識別子であるかを判断する対象識別子判断部と、
上記対象識別子記憶部が上記記憶装置の記憶領域に記憶した対象識別子がデータ識別子であると上記対象識別子判断部が判断した場合に、上記対応関係記憶部が上記記憶装置の記憶領域に記憶したデータ識別子と記憶識別子との対応関係に基づいて、上記対象識別子記憶部が記憶領域に記憶したデータ識別子に対応する記憶識別子を求める対象記憶領域算出部と、
上記対象記憶領域算出部が求めた記憶識別子によって記憶領域を識別し、識別した記憶領域が所定の記憶領域であるか否かを判断する対象記憶領域判断部と、
上記対象記憶領域判断部が識別した記憶領域が所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記対象識別子記憶部が対象識別子を記憶した記憶領域に、上記対象記憶領域算出部が求めた記憶領域識別子を記憶する対象識別子書換部と、
記憶識別子によって識別される記憶領域が記憶したデータの操作を指令する記憶操作指令識別子と、データ識別子によって識別されるデータの操作を指令するデータ操作指令識別子とのいずれかである操作指令識別子を記憶領域に記憶する操作指令記憶部と、
上記対象記憶領域判断部が識別した記憶領域が上記所定の記憶領域であると上記対象記憶領域判断部が判断した場合に、上記操作指令記憶部が操作指令識別子を記憶した記憶領域に、上記記憶領域が記憶したデータ操作指令識別子と同一のデータの操作を指令する記憶操作指令識別子を記憶する操作指令書換部とを有し、
上記対象識別子判断部は、上記操作指令記憶部が記憶領域に記憶した操作指令識別子が記憶操作指令識別子であるかデータ操作指令識別子であるかを判断し、上記操作指令記憶部が記憶領域に記憶した操作指令識別子が記憶操作指令識別子であると判断した場合に、上記対象識別子記憶部が記憶領域に記憶した対象識別子が記憶識別子であると判断し、上記操作指令記憶部が記憶領域に記憶した操作指令識別子がデータ操作指令識別子であると判断した場合に、上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であると判断することを特徴とする記憶管理装置。
【請求項７】
上記記憶管理装置は、更に、
上記操作指令記憶部が記憶領域に記憶した操作指令識別子が指令するデータの操作を解読する操作指令解読部と、
上記対象識別子記憶部が記憶領域に記憶した対象識別子が記憶識別子であると上記対象識別子判断部が判断した場合に、上記対象識別子記憶部が記憶領域に記憶した記憶識別子によって記憶領域を識別し、上記対象識別子記憶部が記憶領域に記憶した対象識別子がデータ識別子であると上記対象識別子判断部が判断した場合に、上記対象記憶領域算出部が算出した記憶識別子によって記憶領域を識別する操作対象識別部と、
上記操作対象識別部が識別した記憶領域が記憶したデータに対し、上記操作指令解読部が解読したデータの操作を実行する操作実行部とを有することを特徴とする請求項５または請求項６に記載の記憶管理装置。
【請求項８】
データを記憶する記憶領域を複数有する記憶装置を備えるコンピュータを、請求項１乃至請求項７のいずれかに記載の記憶管理装置として機能させることを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データを記憶する記憶装置を管理する記憶管理装置に関する。特に、動的に記憶領域を確保するプログラムを実行するプログラム実行装置に用いる記憶管理装置に関する。
【背景技術】
【０００２】
データを記憶する記憶領域を動的に確保するプログラム実行装置では、記憶領域を管理する記憶管理装置に対して、記憶領域の確保を要求し、それに応じて記憶管理装置が空いている記憶領域を確保する。
確保した記憶領域が不用になった場合には、不用になった記憶領域を再利用することにより、記憶領域を有効に活用する。
【０００３】
不用になった記憶領域を明示的に解放する命令をプログラム中に記述しておき、この命令を実行することによって、その記憶領域が再利用可能であることを記憶管理装置に知らせる方式がある。
また、確保した記憶領域が不用になったか否かを記憶管理装置が判別する方式もある。これはガーベージコレクション（Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ：以下「ＧＣ」という。）と呼ばれ、効率的なやり方の研究が盛んに行なわれている（例えば、非特許文献１）。
【０００４】
ＧＣには、まだ不用となっていない記憶領域が記憶しているデータを移動させるものがある。
これは、移動法ＧＣのように、ＧＣのやり方そのものに起因する場合もある。
また、確保されている記憶領域が断片化すると、連続した記憶領域の確保ができなくなる場合があるので、未使用あるいは再利用可能な記憶領域を連続させるために、確保されている記憶領域が記憶しているデータを移動させる場合もある。
【０００５】
このように、データを記憶する記憶領域を動的に確保するプログラム実行装置では、プログラム実行時に、記憶領域の確保を要求し、記憶管理装置が実際に記憶領域を確保するまでは、データを記憶する記憶領域がわからない。
【０００６】
また、記憶管理装置がデータの移動を伴うＧＣを行なう場合には、データを記憶する記憶領域を既に確保している場合であっても、次にそのデータにアクセスするときには、異なる記憶領域がそのデータを記憶している可能性がある。
【０００７】
そこで、従来、プログラム中には、データを識別するデータ識別子（例えば、番号、変数名など）を記述し、データ識別子と、そのデータを記憶した記憶領域を識別する記憶識別子（例えば、メモリのアドレスなど）との対応関係をテーブルとして記憶する方式がある。
プログラム実行装置がプログラムを実行する際は、このテーブルを参照して、実際にデータを記憶している記憶領域を求め、その記憶領域にアクセスすることによって、そのデータにアクセスする。
また、記憶管理装置がそのデータを異なる記憶領域に移動させた場合には、テーブルの記憶識別子を書き換えることにより、プログラム実行装置が正しくそのデータにアクセスできるようにする。
【０００８】
例えば、Ｊａｖａ（登録商標：ジャバ）のクラスファイル（プログラムの一種）を実行するＪａｖａＶＭ（Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ：仮想機械、プログラム実行装置の一種）は、複雑に絡み合った多数のテーブルを参照して、実際にデータを記憶している記憶領域を求め、操作すべきデータにアクセスする。
【０００９】
図２５は、ＪａｖａＶＭが実行するクラスファイル５００の一例を示す図である。
クラスファイル５００は、ヘッダー５１０、コンスタントプール情報５２０、クラス情報５３０、フィールド情報５４０、メソッド情報５５０、属性情報５６０などを有する。
【００１０】
このうち、コンスタントプール情報５２０には、データを参照するための情報（コンスタントプールと呼ばれる）が含まれている。
コンスタントプール情報５２０は、エントリー数５２１、コンスタントプール（＃１〜＃ｎ）５２２〜５２９を有する。
エントリー数５２１は、コンスタントプール（＃１〜＃ｎ）の数を示す。
コンスタントプール（＃１〜＃ｎ）５２２〜５２９は、それぞれタグ５９１、内容５９２を有する。
タグ５９１は、そのコンスタントプールの意味を示す。
内容５９２は、タグ５９１が示す意味によって、異なる可変長のデータである。
例えば、タグ５９１が１の場合、そのコンスタントプールは文字列情報を意味している。内容５９２は、文字列の長さ（バイト数）とＵＴＦ（Ｕｎｉｃｏｄｅ  Ｔｒａｎｓｌａｔｉｏｎ  Ｆｏｒｍａｔ）−８形式の文字コードを示す。
また、タグ５９１が９の場合、そのコンスタントプールはフィールド参照情報を意味している。内容５９２は、クラス参照（そのフィールドが属するクラスについての情報を持つコンスタントプールの参照番号）と名前型参照（そのフィールドの名前及び型についての情報を持つコンスタントプールの参照番号）を示す。
あるいは、タグ５９１が１２の場合、そのコンスタントプールは名前型参照情報を意味している。内容５９２は、名前参照（名前についての文字列情報を持つコンスタントプールの参照番号）と型参照（型についての文字列情報を持つコンスタントプールの参照番号）を示す。
【００１１】
ＪａｖａＶＭが実行するプログラムであるバイトコードは、メソッド情報５５０の中にある。
バイトコードでは、コンスタントプールの参照番号を指定することにより、操作の対象となるデータを示す。
【００１２】
図２６は、メソッド情報５５０に含まれるバイトコード５８０の一部と、コンスタントプール情報５２０の内容の一例を示す図である。
なお、この図では理解を助けるため、コンスタントプールに番号５９３を付してあるが、これはクラスファイル５００のコンスタントプール情報５２０に記述されているものではない。
【００１３】
この例に示したバイトコード５８０の一部は、データ操作命令５８１が示すデータ操作を、参照番号５８２が示すフィールド（データ）に対して行なうことを指令するものである。
【００１４】
この例において、参照番号５８２は「６」なので、番号５９３が「６」のコンスタントプール（＃６）を参照する。
コンスタントプール（＃６）は、フィールド参照情報（タグ５９１が「９」）を示している。内容５９２により、コンスタントプール（＃１）を見れば、操作しようとしているフィールドが属するクラスについての情報が得られ、コンスタントプール（＃９）を見れば、操作しようとしているフィールドの名前及び型についての情報が得られることがわかる。
【００１５】
そこで、コンスタントプール（＃１）を参照する。コンスタントプール（＃１）は、クラス参照情報（タグ５９１が「７」）を示している。内容５９２により、コンスタントプール（＃２０）を見れば、そのクラスの名前についての情報が得られることがわかる。
コンスタントプール（＃２０）を参照すると、そのクラスの名前が「Ｓａｍｐｌｅ」であることがわかる。
【００１６】
また、操作しようとしているフィールドの名前及び型についての情報を得るためには、コンスタントプール（＃９）を参照する。コンスタントプール（＃９）は、名前型参照情報（タグ５９１が「１２」）を示している。内容５９２により、コンスタントプール（＃２７）を見れば、そのフィールドの名前についての情報が得られ、コンスタントプール（＃１７）を見れば、そのフィールドの型についての情報が得られることがわかる。
コンスタントプール（＃２７）を参照すると、そのフィールドの名前が「Ｖａｌｕｅ」であることがわかる。
また、コンスタントプール（＃１７）を参照すると、そのフィールドの型が「Ｉ」（整数型を意味する）であることがわかる。
【００１７】
以上より、データ操作命令５８１が操作しようとしているデータは、Ｓａｍｐｌｅという名前のクラスの、Ｖａｌｕｅという名前の整数型フィールドであることがわかる。
【００１８】
フィールドの詳しい定義情報は、フィールド情報５４０にある。
しかし、クラスファイル５００はクラスごとに存在するので、Ｓａｍｐｌｅという名前のクラスについて定義したクラスファイル５００のフィールド情報５４０を参照する必要がある。
そのクラスファイル５００が定義するクラスの名前等についての情報は、クラス情報５３０にある。
また、そのフィールドが上位のクラスから継承したフィールドであれば、上位のクラスについて定義したクラスファイル５００を参照しなければならない。
そのクラスファイル５００が定義するクラスの上位クラスの名前等についての情報も、クラス情報５３０にある。
【００１９】
このように、データ操作命令５８１を１つ実行するためには、複雑に絡み合ったテーブルを参照して、操作の対象となるデータを求める必要がある。
【００２０】
そこで、従来、このような複雑なテーブル参照を少なくして、データ操作の速度を向上することが行なわれている。
【００２１】
すなわち、１回目の実行で、テーブルを参照して操作の対象となるデータを求めたら、２回目以降は、１回目の結果を用いて、データを操作する。
【００２２】
例えば、特許文献２は、操作すべきデータを求めたのちに、シンボル参照（例えば、参照番号）を、数値参照（例えば、記憶領域のアドレス）に書き換える構成を開示している。
特許文献３の「従来技術」は、特許文献２の方式をもっと詳しく説明している。
すなわち、インストラクション（データ操作命令）を実行する際、コンスタントプールエントリ番号（参照番号）を、フィールドテーブルのインデックス番号に書き換えるとともに、インストラクションも、解決済インストラクションに書き換える構成である。
【００２３】
また、特許文献３は、コンスタントプールを内部的に保持するテーブルに、フィールドテーブルのインデックス番号を記憶する領域を設け、１回目の実行でインデックス番号を書き込む。
これにより、書き換えられたインストラクション（データ操作命令）を実行した場合だけでなく、同じコンスタントプールエントリ番号（参照番号）を参照する別のインストラクションを実行する場合にも、テーブルを辿る必要がなくなる。
【００２４】
ここで、フィールドテーブルとは、そのフィールドのデータを実際に記憶している記憶領域のアドレスを記憶したものである。
したがって、このＪａｖａＶＭは、インデックス番号によってフィールドテーブルを参照し、記憶領域のアドレスを求めて、その記憶領域が記憶したデータを操作する。
ＧＣにより、そのフィールドのデータを実際に記憶している記憶領域が変わった場合には、フィールドテーブルが記憶したアドレスを書き換えて、常に正しくそのデータにアクセスできるようにする。
【特許文献１】特開平２−２２７４５号公報
【特許文献２】特開平６−２３０９７６号公報
【特許文献３】特開２００１−２５６０５８号公報
【非特許文献１】「ごみ集めの基礎と最近の動向」、情報処理学会会誌、Ｖｏｌ．３５、Ｎｏ．１１、１９９４年１１月、９９１ページ〜１０３２ページ
【発明の開示】
【発明が解決しようとする課題】
【００２５】
テーブル参照には、通常、以下のような段階が必要である。
まず、参照番号に、テーブルの１レコード長を乗じる（１レコード長が２のべき乗であれば、シフト演算で代用できる）。
次に、これをテーブルの基底アドレス（参照番号０のデータを記憶している記憶領域の記憶識別子）に加える。
そして、そのアドレスの記憶領域から、目的とするデータを記憶した記憶領域のアドレス（記憶識別子）を読み出す。
最後に、そのアドレスの記憶領域にアクセスすることにより、目的とするデータを操作する。
【００２６】
このような段階を踏むことは、１つの命令を処理するのにかかる時間の増大につながる。
【００２７】
また、テーブルが複雑に絡み合っている場合には、テーブルを参照して得たデータは、目的とするデータを記憶した記憶領域のアドレスではなく、別のテーブルの参照番号であり、そのテーブルを参照して、目的とするデータを記憶した記憶領域のアドレスを得ることができる構成となっている場合もある。
テーブル自体が移動する可能性がある場合には、テーブルの基底アドレスを求めるために、別のテーブルを参照する必要がある場合もある。
【００２８】
このような構成であれば、１つの命令を処理するのにかかる時間は更に増大する。
【００２９】
本発明は、例えば、上記のような課題を解決し、命令の処理時間を短縮し、プログラムの実行速度を速くすることを目的とする。
【課題を解決するための手段】
【００３０】
本発明の記憶管理装置は、
データを記憶する複数の記憶領域を有する記憶装置と、
上記記憶領域がデータを記憶しているか否かを判断する空き領域判断部と、
データを記憶する記憶領域の確保を要求する領域確保要求を取得する領域確保要求取得部と、
上記領域確保要求取得部が上記領域確保要求を取得した場合に、記憶領域がデータを記憶していないと上記空き領域判断部が判断した記憶領域を、上記データを記憶する記憶領域として確保し、確保した記憶領域を識別する記憶識別子を通知する領域確保部と、
上記領域確保要求取得部が領域確保要求を取得した場合に、上記領域確保部が確保する記憶領域が記憶するデータの種別を取得し、データ種別とする種別取得部と、
上記種別取得部が取得したデータ種別が所定のデータ種別であるか否かを判断する種別判断部と、
上記種別取得部が取得したデータ種別が所定のデータ種別であると上記種別判断部が判断した場合に、上記記憶領域のうち所定の記憶領域を上記領域確保部に確保させ、上記種別取得部が取得したデータ種別が所定のデータ種別ではないと上記種別判断部が判断した場合に、上記記憶領域のうち所定の記憶領域以外の記憶領域を上記領域確保部に確保させるデータ割振り部と、
を有することを特徴とする。
【発明の効果】
【００３１】
本発明によれば、ＧＣなどによる移動が少ないデータをあらかじめ判別して、所定の記憶領域に記憶させるので、データの移動が少なくなり、ＧＣなどによる負荷が減るので、プログラムの実行速度が速くなるとの効果を奏する。
【発明を実施するための最良の形態】
【００３２】
ここでは、ＪａｖａＶＭを例にとって説明するが、この記憶管理装置を有する装置は、ＪａｖａＶＭに限らず、Ｃ＋＋、Ｐｅｒｌ（パール）など他のプログラム言語によって記述されたプログラムを実行する装置であっても構わない。
【００３３】
実施の形態１．
実施の形態１を、図１〜図６を用いて説明する。
【００３４】
図１は、この実施の形態における記憶管理装置１００の外観の一例を示す図である。
図１において、記憶管理装置１００は、システムユニット９１０、ＣＲＴ９０１（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ：陰極線管表示装置）、Ｋ／Ｂ９０２（Ｋｅｙｂｏａｒｄ：キーボード）、マウス９０３、ＣＤＤ９０５（Ｃｏｎｐａｃｔ  Ｄｉｓｋ  Ｄｒｉｖｅ：コンパクトディスク装置）、プリンタ装置９０６、スキャナ装置９０７を備え、これらはケーブルで接続されている。
さらに、記憶管理装置１００は、ＦＡＸ機９３２、電話器９３１とケーブルで接続され、また、ＬＡＮ９４２（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ：ローカルエリアネットワーク）、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００３５】
図２は、この実施の形態における記憶管理装置１００のハードウェア構成の一例を示す図である。
図２において、記憶管理装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ：中央処理装置）を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ９１４（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、通信ボード９１５、ＣＲＴ９０１、Ｋ／Ｂ９０２、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）、ＨＤＤ９２０（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ：磁気ディスク装置）、ＣＤＤ９０５、プリンタ装置９０６、スキャナ装置９０７と接続されている。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、ＨＤＤ９２０は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。
通信ボード９１５は、ＦＡＸ機９３２、電話器９３１、ＬＡＮ９４２等に接続されている。
例えば、通信ボード９１５、Ｋ／Ｂ９０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力部の一例である。
また、例えば、通信ボード９１５、ＣＲＴ９０１などは、出力部の一例である。
【００３６】
ここで、通信ボード９１５は、ＬＡＮ９４２に限らず、直接、インターネット９４０、或いはＩＳＤＮ等のＷＡＮ（ワイドエリアネットワーク）に接続されていても構わない。直接、インターネット９４０、或いはＩＳＤＮ等のＷＡＮに接続されている場合、記憶管理装置１００は、インターネット９４０、或いはＩＳＤＮ等のＷＡＮに接続され、ゲートウェイ９４１は不用となる。
磁気ディスク装置９２０には、ＯＳ９２１（オペレーティングシステム）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３は、ＣＰＵ９１１、ＯＳ９２１、ウィンドウシステム９２２により実行される。
【００３７】
上記プログラム群９２３には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
ファイル群９２４には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明するものが、「〜ファイル」として記憶されている。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータの入出力を示し、そのデータの入出力のためにデータは、ＲＡＭ９１４もしくはＨＤＤ９２０、ＦＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ）、光ディスク、ＣＤ（コンパクトディスク）、ＭＤ（ミニディスク）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のその他の記録媒体に記録される。あるいは、信号線やその他の伝送媒体により伝送される。
【００３８】
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、ハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。
【００３９】
また、以下に述べる実施の形態を実施するプログラムは、また、ＲＡＭ９１４もしくはＨＤＤ９２０、ＦＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ）、光ディスク、ＣＤ（コンパクトディスク）、ＭＤ（ミニディスク）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のその他の記録媒体による記録装置を用いて記憶されても構わない。
【００４０】
図３は、この実施の形態における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図である。
【００４１】
図３において、記憶管理装置１００は、記憶装置１１０、領域確保要求取得部１２１、空き領域判断部１２２、領域確保部１２３、記憶識別子記憶部１２４、種別取得部１３１、種別判断部１３２、データ割振り部１３３、記憶識別子取得部１５１、データ操作部１５３などを有する。
【００４２】
記憶装置１１０は、複数の記憶領域を有し、記憶領域はアドレス（記憶識別子の一例）を有する。外部からアドレスを指定することにより、記憶装置１１０内の任意の記憶領域にアクセスできる。
記憶装置１１０は、例えば、ＲＡＭ９１４、ＨＤＤ９２０などを用いて実現する。
【００４３】
領域確保要求取得部１２１は、データを記憶する記憶領域の確保を要求する領域確保要求を取得する。領域確保要求は、外部の（あるいは記憶管理装置１００を有する）プログラム実行装置等が通知するものである。領域確保要求は、電気信号などによるもののほか、特定アドレスの記憶領域に対する特定のデータの書き込み、サブルーチンの呼出しなどにより、記憶管理装置１００に通知される。
領域確保要求取得部１２１は、例えば、ＨＤＤ９２０などが記憶したプログラム等をＣＰＵ９１１が実行することにより実現する。以下の各部も同様である。しかし、その一部あるいは全部をハードウェアにより実現してもよい。
【００４４】
空き領域判断部１２２は、記憶領域が未使用あるいは使用済であるか否かを判断する。
例えば、ポインタを用いて、空き領域の先頭アドレスを指しておき、領域確保部１２３が記憶領域を確保するたびにポインタを進めれば、ポインタが示すアドレス以降のアドレスを有する記憶領域は、未使用であると判断する。
あるいは、それぞれの記憶領域に使用中であるか否かを示すフラグを設け（各記憶領域がフラグを記憶してもよいし、別の記憶領域に、各記憶領域に対応するフラグをまとめて記憶してもよい）、そのフラグを読み出すことにより、使用中であるか否かを判断してもよい。この場合、領域確保部１２３が記憶領域を確保したときに、そのフラグをセットして、その記憶領域が使用中になったことを示す。
あるいは、ＧＣを用いて使用中の記憶領域のフラグをマークし、マークされなかった記憶領域は、再利用可能であると判断してもよい。
【００４５】
領域確保部１２３は、領域確保要求によって要求された大きさ（記憶領域の数）の記憶領域を確保する。確保する記憶領域は、空き領域判断部１２２が未使用あるいは使用済であると判断した記憶領域である。
要求された記憶領域が確保できない場合には、ＧＣによって、使用済の（再利用可能な）記憶領域を探してもよい。
【００４６】
記憶識別子記憶部１２４は、領域確保部１２３が確保した記憶領域のアドレスを、記憶領域に記憶する。複数の記憶領域を確保した場合には、代表する記憶領域の記憶識別子を１つ記憶することとしてもよい。
なお、領域確保部１２３が確保した記憶領域のアドレスは、領域確保要求を通知したプログラム実行装置等に通知してもよい。
領域確保部１２３が確保した記憶領域のアドレスを記憶する記憶領域は、あらかじめ決められたアドレスを有する記憶領域であってもよい。あるいは、他の領域確保要求によって確保された記憶領域であってもよい。
【００４７】
種別取得部１３１は、領域確保要求によって領域確保部１２３が確保する記憶領域が記憶するデータの種別（データ種別）を取得する。データ種別は、領域確保要求とともに、領域確保要求を通知したプログラム実行装置等が通知するものである。
あるいは、領域確保要求の内容（例えば、確保を要求する記憶領域の大きさなど）に基づいて、データ種別を判別してもよい。
【００４８】
種別判断部１３２は、種別取得部１３１が取得したデータ種別が、所定のデータ種別であるか否かを判断する。
【００４９】
例えば、ＪａｖａＶＭにおいて、あるフィールドを操作する場合、そのフィールドの定義情報やそのフィールドの属するクラスの定義情報を得るため、そのフィールドの属するクラスを定義したクラスファイル５００を読み込み、それを内部形式に変換して記憶するための記憶領域を確保する必要がある。これには、クラスファイル５００に含まれるコンスタントプール情報５２０などの定義情報が含まれる。
【００５０】
また、そのクラスのインスタンス（実体）を生成し、生成したインスタンスのフィールドを操作する場合、インスタンスの内容を記憶するための記憶領域を確保する必要がある。ここでは、これを実体情報と呼ぶ。
【００５１】
実体情報を記憶するための記憶領域は、そのインスタンスが消滅すれば必要なくなる。
例えば、処理の都合上必要となる一時的なインスタンスであれば、その処理が終わればすぐに必要なくなる。
あるいは、そのインスタンスに対する参照を記憶した変数が存在しなくなれば、そのインスタンスに対する操作は不可能となるので、そのインスタンスは必要なくなる。
そのインスタンスに対する参照を記憶した変数が存在しなくなるのは、例えば、その変数に他の値を代入した場合や、変数のスコープの外に処理が移ったため、変数そのものが消滅した場合などがある。
【００５２】
これに対し、定義情報を記憶するための記憶領域は、ＪａｖａＶＭによるプログラムの実行が終了するまで、再利用できない。
同じクラスのインスタンスは多数存在し、そのすべてが同じ定義情報を共有するからである。
また、そのクラスのインスタンスがすべて必要なくなった場合であっても、また、新しくそのクラスのインスタンスを生成するかもしれない。そのときに、もう一度クラスファイル５００を読み込んでもよいが、処理が遅くなるので、一度記憶した定義情報は、実行が終了するまで保持しておいたほうがよい。
【００５３】
このように、記憶領域を確保するに際して、そこに記憶するデータのデータ種別によって、寿命の長いもの、短いものが存在する。
【００５４】
そこで、種別判断部１３２は、そのデータ種別が寿命の長いグループ（例えば、定義情報）のものであるか、寿命の短いグループ（例えば、実体情報）のものであるかを判断する。
【００５５】
データ割振り部１３３は、記憶領域を２つグループに分け、種別判断部１３２の判断結果に基づいて、寿命の長いグループと寿命の短いグループとで、異なる記憶領域のグループを、領域確保部１２３に確保させる。
【００５６】
記憶識別子取得部１５１は、記憶識別子記憶部１２４が記憶領域に記憶したアドレスを読み出す。
【００５７】
データ操作部１５３は、記憶識別子取得部１５１が読み出したアドレスを有する記憶領域にアクセスし、その記憶領域が記憶したデータを操作する。
例えば、プログラム実行装置からの指令に基づいて、データの読み出し、書き込み、演算等を行なう。
【００５８】
図４は、この実施の形態において、記憶管理装置１００が記憶領域確保処理を行なう際の、処理の流れの一例を示すフローチャート図である。
【００５９】
Ｓ１１において、領域確保要求取得部１２１が領域確保要求を取得する。
Ｓ１２において、種別取得部１３１がデータ種別を取得する。
Ｓ１３において、種別判断部１３２がデータ種別を判断する。
Ｓ１４において、データ割振り部１３３がデータ種別に基づいて、領域確保部１２３に確保する記憶領域のグループを指示する。
Ｓ１５において、空き領域判断部１２２が確保可能な空き領域を判断する。
Ｓ１６において、領域確保部１２３は、データ割振り部１３３からの指示にしたがって、空き領域判断部１２２が確保可能であると判断した記憶領域を確保する。
Ｓ１７において、記憶識別子記憶部１２４は、領域確保部１２３が確保した記憶領域の記憶識別子を記憶領域に記憶する。
【００６０】
図５は、この実施の形態において、記憶領域２０１〜２２０のグループ分けと、そこに記憶するデータの内容の一例を示す図である。
この図において、記憶領域２０１は、記憶領域２０１〜２２０のなかで、一番アドレスが下位の記憶領域である。また、記憶領域２２０は、一番アドレスが上位の記憶領域である。
【００６１】
定義情報記憶領域２５０は、寿命の長いグループである定義情報を記憶するための記憶領域のグループである。
実体情報記憶領域２６０は、寿命の短いグループである実体情報を記憶するための記憶領域のグループである。
【００６２】
この例では、どちらのグループに必要な記憶領域の数がどれほどになるか不明であるため、定義情報記憶領域２５０と実体情報記憶領域２６０の境目はあいまいになるように構成している。
すなわち、定義情報記憶領域２５０に領域を確保する場合、記憶領域２０１から確保していき、徐々にアドレスが上位の記憶領域を確保する。
また、実体情報記憶領域２６０に領域を確保する場合、記憶領域２２０から確保していき、徐々にアドレスが下位の記憶領域を確保する。
これにより、定義情報記憶領域２５０に記憶すべきデータのほうが多ければ、アドレスが中位の記憶領域（例えば、記憶領域２１０など）は、定義情報記憶領域２５０のグループに入る。
逆に、実体情報記憶領域２６０に記憶すべきデータのほうが多ければ、記憶領域２１０は、実体情報記憶領域２６０に入る。
【００６３】
しかし、最初からそれぞれのグループに入る記憶領域を決めておいてもよい。
【００６４】
この例では、定義情報２５１〜２５３を記憶するための記憶領域を、定義情報記憶領域２５０に確保している。また、実体情報２６１〜２６７を記憶するための記憶領域を、実体情報記憶領域２６０に確保している。その結果、未使用の記憶領域は、記憶領域２０８だけとなっている。
【００６５】
図６は、この実施の形態において、ＧＣを行なって、再利用可能な記憶領域を探し、記憶領域が記憶したデータを移動させることによって、確保できる記憶領域を増やす場合の動作の一例を示す図である。
【００６６】
この例では、実体情報２６１，２６３，２６５が不用となっていたので、実体情報を移動させることにより、確保できる記憶領域を増やしている。
【００６７】
このとき、定義情報２５１〜２５３のほうは不用とならないので、データを移動する必要がないし、不用となっているか否かを判断する必要もない。
【００６８】
このように、寿命の長いデータと寿命の短いデータとを、データの種別によってあらかじめ区別し、異なる場所に記憶領域を確保することにより、ＧＣを行なう際の計算量を減らし、移動させるデータの量を減らすことができるので、ＧＣにかかる時間が少なくなり、プログラムの実行速度が上がるという効果を奏する。
【００６９】
実施の形態２．
実施の形態２を、図１、図２、図７〜図９を用いて説明する。
【００７０】
この実施の形態における記憶管理装置１００の外観及びハードウェア構成は、実施の形態１において図１及び図２を用いて説明した記憶管理装置１００と同様なので、ここでは説明を省略する。
【００７１】
図７は、この実施の形態における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図である。
【００７２】
図７において、記憶管理装置１００は、記憶装置１１０、領域確保要求取得部１２１、空き領域判断部１２２、領域確保部１２３、記憶識別子記憶部１２４、種別判断部１３２、領域判断部１４２、データ移動部１４３、記憶識別子書換部１４４、記憶識別子取得部１５１、データ操作部１５３を有する。
【００７３】
このうち、記憶装置１１０、領域確保要求取得部１２１、空き領域判断部１２２、記憶識別子記憶部１２４、記憶識別子取得部１５１、データ操作部１５３は、実施の形態１において図３を用いて説明したものと同様なので、ここでは説明を省略する。
【００７４】
領域確保部１２３は、領域確保要求によって要求された大きさ（記憶領域の数）の記憶領域を確保する。確保する記憶領域は、空き領域判断部１２２が未使用あるいは使用済であると判断した記憶領域である。
このとき、データ種別にかかわらず、記憶領域全体を１つのグループとして、領域を確保する。
【００７５】
種別判断部１３２は、記憶領域が記憶したデータの種別を判断する。
例えば、領域確保要求とともに、プログラム実行装置が通知したデータ種別を、この実施の形態では図示していない種別取得部が取得し、確保した記憶領域、あるいは別の記憶領域に、やはり図示していない種別記憶部が記憶しておく。種別判断部１３２は、これを読み出して、データ種別を判断する。
あるいは、その記憶領域に対する参照の種類によって、データ種別を判断してもよい。
例えば、その記憶領域のアドレスをフィールドテーブルが記憶している場合には、その記憶領域はフィールドのデータを記憶していることが判断できる。
【００７６】
領域判断部１４２は、その記憶領域が長寿データ記憶用の記憶領域か、短命データ記憶用の記憶領域かを判断する。
なお、記憶領域は、あらかじめどちらの目的に使うかを定めておいてもよいし、状況に応じて、どちらの目的に使う記憶領域が必要かを判断し、用途を変えることとしてもよい。
【００７７】
データ移動部１４３は、種別判断部１３２と領域判断部１４２の判断結果に基づいて、記憶領域が記憶したデータを移動させる。
例えば、長寿データ記憶用の記憶領域が、短命のデータを記憶している場合や、逆に、短命データ記憶用の記憶領域が長寿のデータを記憶している場合に、そのデータを移動させる。
なお、これ以外に、ＧＣによってデータを移動させる場合があってもよい。
【００７８】
記憶識別子書換部１４４は、データ移動部１４３がデータを移動させた場合に、記憶識別子記憶部１２４が記憶領域に記憶したアドレスを書き換えて、データ操作部１５３が正しくデータにアクセスできるようにする。
【００７９】
図８は、この実施の形態において、記憶管理装置１００がデータ移動処理を行なう際の、処理の流れの一例を示すフローチャート図である。
【００８０】
Ｓ２１において、種別判断部１３２がデータ種別を判断する。
Ｓ２２において、領域判断部１４２が記憶領域の用途を判断する。
Ｓ２３において、データ移動部１４３がデータを移動させるか否かを判断し、移動させると判断した場合には、記憶領域が記憶したデータを読み出し、読み出したデータを他の記憶領域に記憶する。
Ｓ２４において、記憶識別子書換部１４４が、データを記憶した記憶領域のアドレスを記憶した記憶領域に、データ移動部１４３がデータを移動した移動先の記憶領域のアドレスを記憶する。
【００８１】
図９は、この実施の形態において、記憶領域２０１〜２２０が記憶するデータの内容の一例を示す図である。
【００８２】
領域確保部１２３は、データ種別を気にせず、領域確保要求を受けた順に記憶領域を確保するので、ＧＣ前２９１において、記憶領域２０１〜２２０は、定義情報と実体情報とが入り混じった状態になっている。
ここで、未使用の記憶領域が記憶領域２２０だけになったので、ＧＣを行なう。
【００８３】
ＧＣ中２９２において、この実施の形態では図示していない空き領域判断部が、再利用できる記憶領域を判断する。この例では、実体情報２６１，２６３，２６５が不用となっていたので、データを移動させることにより、確保できる領域を増やすことができる。
【００８４】
ＧＣに伴ってデータを移動させるにあたり、単純にデータをずらして隙間を詰めるのではなく、データ種別に応じて、データの順序を入れ替える。この処理はデータ移動部１４３が行なう。
【００８５】
この例では、定義情報２５１，２５２，２５３は今後不用になる可能性のない長寿データである。
定義情報２５１，２５２，２５３を記憶するためには、記憶領域が合計７つ必要なので、領域判断部１４２は、記憶領域２０１〜２０７を長寿データ用記憶領域２７０と判断し、それ以外の記憶領域２０８〜２２０は、短命データ用記憶領域２８０と判断する。
【００８６】
データ移動部１４３は、定義情報２５１，２５２，２５３を長寿データ用記憶領域２７０に移動させ、実体情報２６２，２６４，２６６，２６７は短命データ用記憶領域２８０に移動させる。
【００８７】
これにより、次回からは長寿データ用記憶領域２７０のデータを移動させる必要がないし、不用となっているか否かを判断する必要もない。したがって、ＧＣにかかる時間が少なくなり、プログラムの実行速度が上がるという効果を奏する。
【００８８】
また、あらかじめ記憶領域の用途を定めておく必要がないので、長寿データと短命データとがどのくらいの割合で発生するかをあらかじめ知る必要がなく、記憶領域を有効に活用できる。
【００８９】
なお、実体情報のなかにも、長寿なものがある。経験的に、ＧＣを潜り抜けて生き続けているデータは、次回のＧＣも潜り抜けて生き続ける可能性が高い。
そこで、今回生き残った実体情報２６２，２６４，２６６，２６７については、長寿候補であるとしてマークしておき、次回のＧＣでも生きていた場合には、長寿データ用記憶領域に入れることとしてもよい。
【００９０】
すなわち、記憶領域２０１〜２０７が長寿データ用記憶領域、記憶領域２１４までが長寿候補データ領域として記憶しておく。例えば、長寿データ用記憶領域のなかで一番上位の記憶領域である記憶領域２０７のアドレスと、長寿候補データ領域のなかで一番上位の記憶領域である記憶領域２１４のアドレスを、記憶領域に記憶しておく。
【００９１】
そして、長寿候補データ領域の中のデータについて、種別判断部１３２は、定義情報であっても実体情報であっても区別せず、長寿データであると判断する。
【００９２】
これにより、不用であるかを判断するデータの量、及び、移動させるデータの量が更に減るので、ＧＣにかかる時間が更に少なくなり、プログラムの実行速度が上がるという効果を奏する。
【００９３】
実施の形態３．
実施の形態３を、図１、図２、図５、図６、図９〜図１１を用いて説明する。
【００９４】
この実施の形態における記憶管理装置１００の外観及びハードウェア構成は、実施の形態１において図１及び図２を用いて説明した記憶管理装置１００と同様なので、ここでは説明を省略する。
【００９５】
図１０は、この実施の形態における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図である。
図１０において、記憶管理装置１００は、記憶装置１１０、識別子記憶部１６０、対応関係記憶部１６３、対象識別子判断部１７１、対象記憶領域算出部１７２、対象記憶領域判断部１７３、識別子書換部１６５を有する。
【００９６】
記憶装置１１０は、複数の記憶領域を有し、記憶領域はアドレス（記憶識別子の一例）を有する。外部からアドレスを指定することにより、記憶装置１１０内の任意の記憶領域にアクセスできる。
【００９７】
識別子記憶部１６０は、識別子情報記憶部１６１及び対象識別子記憶部１６２を有する。
対象識別子記憶部１６２は、対象識別子を記憶領域に記憶する。
ここで、対象識別子とは、データを記憶した記憶領域を識別する記憶識別子（例えば、アドレスなど）、あるいは、データを識別するデータ識別子（例えば、変数名やコンスタントプールの参照番号など）をいう。
識別子情報記憶部１６１は、識別子情報を記憶領域に記憶する。
ここで、識別子情報とは、対象識別子記憶部１６２が記憶領域に記憶した対象識別子が記憶識別子であるか、データ識別子であるかを区別するための情報である。
対象識別子記憶部１６２と識別子情報記憶部１６１は、対象識別子と識別子情報をセットにして（例えば、対象識別子の最上位ビットを識別子情報のフラグとして用いるなど）、１つの記憶領域に記憶してもよい。あるいは、対応する別の記憶領域に記憶してもよい。
なお、識別子情報は、対象識別子が記憶識別子であるかデータ識別子であるかを判断するための情報の一例であって、他の手段により両者を区別できる場合には、識別子情報記憶部１６１はなくてもよい。
【００９８】
対応関係記憶部１６３は、データ識別子と記憶領域識別子との対応関係を記憶領域に記憶する。
変数名などのデータ識別子は、データを抽象的に表現したものであって、実体としてのデータは、いずれかの記憶領域が記憶するものである。したがって、プログラム等からデータを操作するには、そのデータを記憶した記憶領域のアドレス等、記憶識別子によって記憶領域を識別し、識別した記憶領域にアクセスする必要がある。
したがって、プログラム等に記述されたデータ識別子を、そのデータ識別子によって識別されるデータを実際に記憶している記憶領域の記憶識別子に変換する必要がある。
対応関係記憶部１６３が記憶領域に記憶する対応関係とは、その変換に用いるテーブル等のデータである。テーブル等のデータ構成については、既知の構成が多数存在するので、ここでは詳しく説明しない。
【００９９】
対象識別子判断部１７１は、対象識別子記憶部１６２が記憶領域に記憶した対象識別子が記憶識別子であるか、データ識別子であるかを判断する。判断は、識別子情報記憶部１６１が記憶領域に記憶した識別子情報に基づいて行なう。あるいは、他の手段によって両者を区別できる場合には、それに基づいて判断してもよい。
【０１００】
対象記憶領域算出部１７２は、対象識別子がデータ識別子である場合に、対応関係記憶部１６３が記憶領域に記憶した対応関係に基づいて、データ識別子を記憶識別子に変換する。
【０１０１】
対象記憶領域判断部１７３は、対象記憶領域算出部１７２が変換した記憶識別子に基づいて、対象データを記憶した記憶領域が、ＧＣなどによるデータ移動のない記憶領域であるか否かを判断する。
【０１０２】
識別子書換部１６５は、識別子情報書換部１６６及び対象識別子書換部１６７を有する。
対象識別子書換部１６７は、対象識別子記憶部１６２が記憶領域に記憶した対象識別子を、データ識別子からそれに対応する記憶識別子に書き換える。
識別子情報書換部１６６は、それに対応して、識別子情報を、対象識別子が記憶識別子であることを示す情報に書き換える。
【０１０３】
対象識別子がデータ識別子である場合、そのデータを操作するには、対応関係記憶部１６３が記憶領域に記憶した対応関係を参照して、そのデータを記憶した記憶領域の記憶識別子を求める必要がある。
これに対して、対象識別子が記憶識別子であれば、そのまま直接、記憶識別子によって識別される記憶領域にアクセスすることができるので、処理時間が短くてすむ。
したがって、プログラムの実行にかかる処理時間を短くするためには、対象識別子が記憶識別子であるほうがよい。
【０１０４】
しかし、ＧＣなどにより、データを移動する場合には、そのデータを記憶している記憶領域が変わるので、対象識別子として記憶した記憶識別子も、移動先の記憶領域の記憶識別子に書き換える必要があり、手間がかかる。
対象識別子がデータ識別子であれば、対応関係記憶部１６３が記憶領域に記憶した対応関係を書き換えるだけで、データの移動に対処できる。
【０１０５】
そこで、ＧＣなどによりデータを移動する可能性がない場合には、対象識別子を記憶識別子に書き換えることにより、処理速度の向上を図る。
また、ＧＣなどによりデータを移動する可能性がある場合には、対象識別子がデータ識別子であってもそのままにしておく。記憶識別子に書き換えることによる処理時間の短縮効果よりも、ＧＣなどによりデータを移動した場合の処理が増えることによるマイナスが大きいからである。
【０１０６】
ＧＣなどによりデータを移動する可能性があるか否かの判断は、上述したように、対象記憶領域判断部１７３が行なう。
【０１０７】
例えば、実施の形態１で図５及び図６を用いて説明した記憶方式である場合、定義情報記憶領域２５０が記憶したデータは、ＧＣなどにより移動することがない。
これに対し、実体情報記憶領域２６０が記憶したデータは、ＧＣなどにより移動する可能性がある。
したがって、そのデータを記憶した記憶領域の記憶識別子に基づいて、それが定義情報記憶領域２５０に属するものか、実体情報記憶領域２６０に属するものかを判断すれば、そのデータを移動する可能性があるか否かがわかる。
具体的には、例えば、定義情報記憶領域２５０の記憶領域の最上位のもの（図６の例でいえば、記憶領域２０７）のアドレス（記憶識別子）を記憶しておき、そのアドレスと、対象データを記憶した記憶領域のアドレスとの大小関係を比較する比較器を設けることにより、判断が可能である。なお、これは一例であって、その他既知の判断方式によって判断してもよい。
【０１０８】
あるいは、実施の形態２で図９を用いて説明した記憶方式である場合なら、長寿データ用記憶領域２７０が記憶したデータは、ＧＣなどにより移動することはなく、短命データ用記憶領域２８０が記憶したデータは、ＧＣなどにより移動する可能性がある。
したがって、上述したのと同様に、そのデータを記憶した記憶領域の記憶識別子に基づいて、それが長寿データ用記憶領域２７０に属するものか、短命データ用記憶領域２８０に属するものかを判断すれば、そのデータを移動する可能性があるか否かがわかる。
【０１０９】
図１１は、この実施の形態において、記憶管理装置１００が対象識別子書換処理を行なう際の、処理の流れの一例を示すフローチャート図である。
【０１１０】
Ｓ３１において、対象識別子判断部１７１は、対象識別子が記憶識別子であるかデータ識別子であるかを判断する。
対象識別子が記憶識別子であると判断した場合には、処理を終了する。
対象識別子がデータ識別子であると判断した場合には、Ｓ３２に進む。
【０１１１】
Ｓ３２において、対象記憶領域算出部１７２は、データ識別子である対象識別子に対応する記憶識別子を、対応関係記憶部１６３が記憶領域に記憶した対応関係に基づいて、算出する。
【０１１２】
Ｓ３３において、対象記憶領域判断部１７３は、対象記憶領域算出部１７２が算出した記憶識別子に基づいて、そのデータが移動のある領域に記憶されているか、移動のない領域に記憶されているかを判断する。
移動のある領域に記憶されていると判断した場合には、処理を終了する。
移動のない領域に記憶されていると判断した場合には、Ｓ３４に進む。
【０１１３】
Ｓ３４において、識別子書換部１６５は、識別子記憶部１６０が記憶領域に記憶した対象識別子を記憶識別子に書き換え、それに対応して識別子情報も書き換える。
【０１１４】
このように、ＧＣなどによりデータを移動する可能性がある場合と、データを移動する可能性がない場合とで異なる取り扱いとし、データを移動する可能性がない場合には、対象識別子を記憶識別子に書き換えて処理速度の向上を図り、データを移動する可能性がある場合には、対象識別子をデータ識別子のままにしてＧＣなどにおける処理の負担が増えることを防ぐことにより、全体の処理時間が短くなり、プログラムの実行速度が上がるという効果を奏する。
【０１１５】
実施の形態４．
実施の形態４を、図１、図２、図１２〜図１４、図２７を用いて説明する。
【０１１６】
この実施の形態における記憶管理装置１００の外観及びハードウェア構成は、実施の形態１において図１及び図２を用いて説明した記憶管理装置１００と同様なので、ここでは説明を省略する。
【０１１７】
図１２は、この実施の形態における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図である。
図１２において、記憶管理装置１００は、記憶装置１１０、コマンド記憶部１８０、対応関係記憶部１６３、対象識別子判断部１７１、対象記憶領域算出部１７２、対象記憶領域判断部１７３、コマンド書換部１８５、操作指令解読部１９１、操作対象識別部１９２、操作実行部１９３を有する。
【０１１８】
このうち、記憶装置１１０、対応関係記憶部１６３、対象識別子判断部１７１、対象記憶領域算出部１７２、対象記憶領域判断部１７３は、実施の形態３において図１０を用いて説明したものと同様なので、ここでは説明を省略する。
【０１１９】
コマンド記憶部１８０は、コマンドを記憶領域に記憶する。
ここで、コマンドとは、記憶管理装置１００に対して記憶領域が記憶したデータの操作を指令するもので、プログラムの一部である。
この例では、コマンドは操作指令識別子と対象識別子とからなる。
操作指令識別子は、記憶領域が記憶したデータの操作方法（例えば、読み出し、書き込み、演算など）を示すもので、操作指令記憶部１８１が記憶領域に記憶する。
また、対象識別子は、操作対象を識別するもので、記憶識別子あるいはデータ識別子である。対象識別子は、対象識別子記憶部１６２が記憶領域に記憶する。
対象識別子が記憶識別子であるか、データ識別子であるかを区別する識別子情報は、操作指令識別子の中に含まれる。すなわち、同じデータ操作を指令する場合であっても、異なる操作指令識別子を用いることによって、区別する。すなわち、操作対象の識別が記憶識別子によって行われる場合には記憶操作指令識別子を用い、データ識別子によって行われる場合にはデータ操作指令識別子を用いる。
【０１２０】
図２７は、ＪａｖａＶＭが実行するクラスファイルで使われるバイトコード（コマンドの一例）のオペコード５７１（操作指令識別子の一例）とオペランド５７２（対象識別子の一例）の意味（一部）を示す図である。
例えば、オペコード５７１が「Ｂ２」（１バイト（８ビット）のデータであるが、ここでは１６進数で表現している）である場合、オペランド５７２（２バイト（１６ビット）のデータ）はコンスタントプールの参照番号を示す。そして、その参照番号により参照したコンスタントプールの内容によって識別されるスタティックフィールドに対して、データを読み出すという操作を行なうことを意味している（データ操作指令識別子の一例）。
【０１２１】
ここで、スタティックフィールドとは、クラスに固有のフィールドで、インスタンスに依存しないものをいう。通常、スタティックフィールドのデータの内容は、クラスの定義情報を記憶する記憶領域に記憶する。
また、非スタティックフィールドとは、インスタンスに固有のフィールドで、同じクラスのインスタンスでも、インスタンスごとに異なる値を持つことができるものをいう。通常、非スタティックフィールドのデータの内容は、インスタンスの実体情報を記憶する記憶領域に記憶する。
【０１２２】
コマンド書換部１８５は、対象識別子がデータ識別子である場合に、それを記憶識別子に書き換え、それに対応して、操作指令識別子も、記憶操作指令識別子に書き換える。
すなわち、対象識別子は、対象識別子書換部１６７が書き換え、操作指令識別子は、操作指令書換部１８６が書き換える。
【０１２３】
図２７に示したオペコード５７１はすべて、オペランド５７２がコンスタントプールの参照番号を意味する。すなわち、オペランド５７２はデータ識別子である。
これは、ＪａｖａＶＭは、記憶領域を動的に割り当てるので、クラスファイルを読み込む前にそのデータを記憶する記憶領域がどこになるかを知ることは不可能だからである。
【０１２４】
したがって、ＪａｖａＶＭが実行するクラスファイルで使われるバイトコードのオペコード５７１には、オペランド５７２が記憶識別子であることを意味するものは存在しない。
ここで、バイトコードのオペコード５７１は、「００」〜「ＣＡ」，「ＦＥ」，「ＦＦ」（いずれも１６進数）はその意味が定義されているが、「ＣＢ」〜「ＦＤ」については定義されていない。
定義されていないオペコード５７１「ＣＢ」〜「ＦＤ」については、クラスファイル中に決して現れることがないので、ＪａｖａＶＭが実行時に自由に使うことができる。
【０１２５】
図１３は、この実施の形態において、拡張したバイトコードのオペコード５７１とオペランド５７２の意味（一部）の一例を示す図である。
【０１２６】
図１３において、拡張されたオペコード５７１「Ｅ６」〜「Ｅ９」は、オペランド５７２が記憶領域のアドレス（記憶識別子）を直接示す（記憶操作指令識別子の一例）。
なお、フィールドの型によって、扱うデータのサイズ（例えば、３２ビット長か６４ビット長か）が異なるので、この例では、型ごとに異なるオペコード５７１を割り当てている。しかし、他の方法で扱うべきデータのサイズが分かるのであれば、型を区別せず同じオペコードを割り当ててもよい。
【０１２７】
操作指令書換部１８６は、元のオペコードを、このように拡張されたオペコード５７１に書き換える。
【０１２８】
操作指令解読部１９１は、拡張されたオペコード５７１を解読し、どのようなデータ操作を指令されたかを判別する。
【０１２９】
操作対象識別部１９２は、操作対象となるデータを記憶した記憶領域の記憶識別子を取得する。すなわち、対象識別子判断部１７１の判断により、対象識別子が記憶識別子である場合には、その記憶識別子をそのまま取得し、対象識別子がデータ識別子である場合には、対象記憶領域算出部１７２が算出した記憶識別子を取得する。
【０１３０】
操作実行部１９３は、操作対象識別部１９２が取得した記憶識別子に基づいて、その記憶識別子によって識別される記憶領域にアクセスし、操作指令解読部１９１が解読したデータ操作を行なう。
【０１３１】
図１４は、この実施の形態において、記憶管理装置１００がコマンド書換処理を行う際の、処理の流れの一例を示すフローチャート図である。
【０１３２】
Ｓ４１において、対象識別子判断部１７１は、対象識別子が記憶識別子であるかデータ識別子であるかを判断する。この判断は、操作指令識別子が記憶操作識別子であるか、データ操作識別子であるかを判断することによって行なう。
対象識別子が記憶識別子であると判断した場合には、処理を終了する。
対象識別子がデータ識別子であると判断した場合には、Ｓ４２に進む。
【０１３３】
Ｓ４２において、対象記憶領域算出部１７２は、データ識別子である対象識別子に対応する記憶識別子を、対応関係記憶部１６３が記憶領域に記憶した対応関係に基づいて、算出する。
【０１３４】
Ｓ４３において、対象記憶領域判断部１７３は、対象記憶領域算出部１７２が算出した記憶識別子に基づいて、そのデータが移動のある領域に記憶されているか、移動のない領域に記憶されているかを判断する。
移動のある領域に記憶されていると判断した場合には、処理を終了する。
移動のない領域に記憶されていると判断した場合には、Ｓ４４に進む。
【０１３５】
Ｓ４４において、コマンド書換部１８５は、コマンドの種別が書き換えられるコマンドか否かを判断する。
書き換えられないコマンドであると判断した場合には、処理を終了する。
書き換えられるコマンドであると判断した場合には、Ｓ４５に進む。
【０１３６】
Ｓ４５において、コマンド書換部１８５は、コマンド記憶部１８０が記憶領域に記憶した対象識別子を記憶識別子に書き換え、それに対応して操作指令識別子も、記憶操作指令識別子に書き換える。
【０１３７】
ここで、書き換えられるコマンドとは、例えば、図１３においていれば、オペコード「Ｂ２」（スタティックフィールドのデータの読出し）である。スタティックフィールドは、インスタンスに依存せず、クラスに固有のものである。操作対象のクラスは、コンスタントプールによって決まるので、常に同じである。したがって、同じコマンドであれば、常に同じデータに対する操作であるから、そのデータが移動しないのであれば、アドレスによる参照に書き換えることができる。
【０１３８】
これに対し、書き換えられないコマンドとは、例えば、図１３においていえば、オペコード「Ｂ４」（非スタティックフィールドのデータの読出し）である。非スタティックフィールドは、インスタンスごとに異なる値を持つので、インスタンスごとに異なる記憶領域が記憶する。操作対象のインスタンスは、スタックに詰まれた参照によって決まるので、同じコマンドでも常に同じとは限らない。したがって、アドレスに書き換えることはできない。
【０１３９】
コマンドに基づいて、データ操作を行なう場合、そのコマンドに含まれる操作指令識別子がどのような操作を指示しているかを解釈することは必ず必要である。この解釈は、具体的には、テーブル等を使った条件分岐によって行なわれる。
したがって、操作指令識別子の中に、対象識別子が記憶識別子かデータ識別子かを示す情報を組み込んでしまえば、条件分岐の数を増やさずに、対象識別子によって、データを識別する方法を変えることができ、プログラムの実行速度が速くなる。
【０１４０】
そのうえ、ＧＣなどによりデータが移動する可能性がない場合には、データ識別子を記憶識別子で書き換えることにより、複雑なテーブル参照をする必要がなくなり、更に実行速度が速くなる。
【０１４１】
特に、実施の形態１および実施の形態２で説明した方式によって、移動させるデータの量を減らせば、記憶識別子に書き換えることのできる対象識別子の数が増え、ますますプログラムの実行速度が速くなるという効果を奏する。
【０１４２】
なお、コマンド書換処理は、クラスファイルを読み込んだときに行なってもよい。その場合は、あらかじめデータを記憶する記憶領域を確保しておく必要がある。
【０１４３】
あるいは、実際にコマンドを実行するときに、行なうこととしてもよい。コマンドを実行するときには、操作指令識別子を解読したり、対象識別子によって識別される対象の記憶識別子を求めたりする必要があるので、このときに同時にコマンド書換処理を行なうこととすれば、重複する処理を繰り返す必要がなく、効率的である。
【０１４４】
実施の形態５．
実施の形態５を、図１、図２、図１５〜図１８を用いて説明する。
【０１４５】
この実施の形態におけるプログラム実行装置６００（記憶管理装置の一例）の外観及びハードウェア構成は、実施の形態１において図１及び図２を用いて説明した記憶管理装置１００と同様であるから、ここでは説明を省略する。
【０１４６】
図１５は、この実施の形態におけるプログラム実行装置６００の機能ブロックの構成の一例を示すブロック構成図である。
図１５において、プログラム実行装置６００は、インストラクション格納部６１０、クラスファイル情報管理部６２０、インストラクション実行部６３０、テーブル管理部６４０、参照解決部６５０、メモリ配置判定部６６０、動的メモリ確保部６７０、メモリ再配置ＧＣ部６８０、メモリ６９０を有する。
【０１４７】
プログラム実行装置６００は、メモリ６９０（記憶装置の一例）中の使用されていない記憶領域を回収するＧＣ処理によって、回収した記憶領域をプログラムに動的に割り当てるプログラム実行環境を備える。
プログラム実行装置６００は、インタプリタ型のプログラム実行装置であって、命令を一つ一つ解釈しながら実行を行う。
この実施の形態で説明するプログラム実行装置６００は、Ｊａｖａ（登録商標）のソースプログラムよりコンパイルされたバイトコードのプログラムを実行するものである。
【０１４８】
インストラクション格納部６１０（コマンド記憶部の一例）は、インストラクションコード（操作指令識別子の一例）とオペランド（対象識別子の一例）からなるバイトコードのプログラムをメモリ６９０に格納する。
【０１４９】
クラスファイル情報管理部６２０は、インストラクションに指定された参照の内容を示す参照情報をまとめたクラスファイル情報をメモリ６９０に記憶する。
【０１５０】
テーブル管理部６４０（対応関係記憶部の一例）は、各クラスファイル情報からクラステーブル、フィールドテーブル、メソッドテーブル等の参照用のテーブルを作成し、メモリ６９０に記憶する。
これらの参照用テーブルの設定情報は、インストラクション実行部６３０、参照解決部６５０が利用するものである。
【０１５１】
インストラクション実行部６３０（操作実行部の一例）は、インストラクション格納部６１０からインストラクションを読み込み、実行する。
【０１５２】
動的メモリ確保部６７０（領域確保部の一例）は、インストラクション実行部６３０からの要求（領域確保要求）に応じて、インスタンスを記憶するための記憶領域をメモリ６９０から確保し、確保した記憶領域のアドレスを、インスタンスに含まれる変数に割り当てる。
動的メモリ確保部６７０は、メモリ６９０からインスタンスの領域を確保できなかった場合、メモリ再配置ＧＣ部６８０に対して、プログラムが利用していない領域の回収を要求する。
【０１５３】
メモリ再配置ＧＣ部６８０（データ移動部の一例）は、現在プログラムが利用している領域をマークして、使用されていない領域を回収する処理を実行する。
また、動的メモリ確保部６７０が確保しようとした大きさの連続した領域が確保できなかった場合には、メモリ６９０のコンパクション処理を実行する。
なお、この実施の形態のプログラム実行装置６００は、コンパクション処理時にクラスインスタンスの配置の変更が無くなるように再配置する処理を行なう。
【０１５４】
動的メモリ確保部６７０は、図示していない記憶領域割当部、データ領域割当部を有する。
記憶領域割当部は、動的メモリ確保部６７０に対して行われたメモリ領域確保の要求に対して、メモリ６９０中の使用されていない記憶領域を提供する処理を行う。
【０１５５】
参照解決部６５０は、インストラクションの要求する参照の解決を行う。
この実施の形態では、プログラムの実行に先立ち、各クラスファイル情報に含まれる情報について、それぞれの名前による参照を解決し、得られた参照解決結果をクラスファイルに書き込む。
参照の解決方法及び、クラスファイル情報内に書き込まれる処理についての詳細は、既知の方式が存在するので、ここでは詳しく説明しない。
【０１５６】
メモリ配置判定部６６０（対象記憶領域判断部の一例）は、この実施の形態におけるプログラム実行装置６００の主要な役割を果たすブロックである。
メモリ配置判定部６６０は、インストラクション実行部６３０の問合せに応じて、実行されるインストラクションに指定されたフィールドやメソッドを含むインスタンスが割り当てられている領域の配置が頻繁に移動するかどうかの判定を行う。
【０１５７】
インストラクション実行部６３０は、メモリ配置判定部６６０の判定結果に基づいて、データ格納領域のアドレスをクラスファイル情報管理部６２０に含まれるクラスファイル情報内に書き込む。
【０１５８】
次に、動作の詳細について説明する。
【０１５９】
図１６は、この実施の形態において、プログラム実行装置６００が、インストラクション格納部６１０が記憶したプログラムを実行する際の、処理の流れの一例を示すフローチャート図である。
この図は、システム起動からクラスファイル参照の解決、また、プログラム実行において、インスタンスのメモリ領域の配置を判定し、フィールド、クラスのデータ格納領域のアドレスをクラスファイル情報内に格納し、インストラクションを実行する一連の流れを示している。
図１７は、この実施の形態において、インストラクション格納部６１０、クラスファイル情報管理部６２０、テーブル管理部６４０が記憶する内容の一例を示す図である。
【０１６０】
Ｓ５１〜Ｓ５６は、システム起動時の処理である。
プログラム実行装置６００は、プログラムの実行を開始する前に、必要なクラスの参照解決を行なう。参照解決の結果は、クラスファイル情報管理部６２０が記憶する。
参照解決処理の詳細については、既知の方式があるので、ここでは詳しく説明しない。
また、このように、プログラム実行前に、すべての参照を解決しておくのではなく、プログラムを実行しながら、必要になった段階で、参照を解決することとしてもよい。
【０１６１】
クラスファイル情報管理部６２０は、クラスファイルの情報をテーブルにして記憶する。
例えば、コンスタントプールの内容６２１についての情報を記憶する。図１７の例では、コンスタントプールの参照番号６として、「クラス参照：１」「名前型参照：９」という情報を記憶している。
フィールドテーブルインデックス６２２（データ識別子の一例）は、フィールドテーブルへの参照番号を示す。この例において「−１」は、参照番号を記憶していないことを示している。
フィールドテーブルは、テーブル管理部６４０が記憶している。
フィールドテーブルは、そのフィールドのデータを実際に記憶するメモリのアドレスを記憶する。
この例では、コンスタントプール参照番号６のフィールドについて操作する場合、そのフィールドのデータを記憶しているメモリのアドレスはフィールドテーブルの参照番号３５を見ればわかる。フィールドテーブルによれば、データ格納アドレス６４１（記憶識別子の一例）は「ＡＢＣＤ」なので、メモリ６９０（記憶装置の一例）のアドレス「ＡＢＣＤ」（記憶領域の一例）にアクセスすることにより、そのフィールドのデータを操作できる。
【０１６２】
Ｓ５７〜Ｓ６３は、プログラム実行時の処理である。
この実施の形態によるクラスファイル情報に対して、データ格納領域のアドレスを格納し、インストラクションを実行する。
【０１６３】
Ｓ５７において、インストラクション実行部６３０は、インストラクション格納部６１０からインストラクションを読み込む。
【０１６４】
次に、Ｓ５８において、インストラクション実行部６３０は、クラスファイル情報内のデータ格納アドレスが設定されているかを確認する。
後述するように、クラスファイル情報管理部６２０がフィールドテーブルインデックス６２２（データ識別子の一例）ではなく、データ格納アドレス６２３（記憶識別子の一例）を記憶している場合には、インストラクション格納部６１０の内容を書き換えて、データ操作命令６１１が、データ操作命令６１３になっている（識別子情報の一例）。
したがって、インストラクション実行部６３０は、データ操作命令が何であるかを判断することで、クラスファイル情報にデータ格納アドレスが設定されているかを判断する。
インストラクション実行部６３０は、データ格納アドレスが設定されていると判断した場合、Ｓ６２に進み、インストラクションの実行手続をする。
インストラクション実行部６３０は、データ格納アドレスが設定されていないと判断した場合、Ｓ５９に進む。
【０１６５】
Ｓ５９において、インストラクション実行部６３０は、クラスファイル情報内のインデックスを用いて、該当するテーブルからデータ格納アドレスを求める。
この例でいえば、コンスタントプールの参照番号６から、フィールドテーブルインデックス６２２「３５」を取得し、これをオブジェクトオフセット値として、フィールドの値を格納した領域のアドレスであるデータ格納アドレス「ＡＢＣＤ」を求める。
【０１６６】
Ｓ６０において、メモリ配置判定部６６０は、求めたデータ格納アドレスが移動の多い領域に配置されているかを判定する。判定の詳細については、後述する。
インストラクション実行部６３０は、メモリ配置判定部６６０が移動の多い領域であると判定した場合、Ｓ６２に進み、算出したデータ格納アドレスを用いて、インストラクションの実行手続を行う。
インストラクション実行部６３０は、メモリ配置判定部６６０が移動の多い領域でないと判定した場合、Ｓ６１に進む。
【０１６７】
Ｓ６１において、クラスファイル情報管理部６２０は、算出したデータ格納アドレス６２３を記憶する。また、インストラクション格納部６１０は、データ操作命令を書き換える。
【０１６８】
Ｓ６２において、インストラクション実行部６３０は、実際にインストラクションを実行する。
【０１６９】
Ｓ６３において、インストラクション実行部６３０は、終了判定を行なう。実行終了でない場合には、Ｓ５７に戻り、インストラクション毎に同様の処理が実行される。
インストラクション実行部６３０が実行終了であると判断した場合には、プログラムの実行を終了する。
【０１７０】
これにより、テーブルの参照を１段階少なくすることができるので、インストラクションの実行にかかる時間が短縮され、プログラムの実行速度が速くなるという効果を奏する。
【０１７１】
次に、Ｓ６０におけるメモリ配置判定部６６０の判定について、詳述する。
【０１７２】
メモリ配置判定部６６０は、メモリのアドレスから、そのメモリに記憶したデータがＧＣなどによって頻繁に移動するものであるか、頻繁に移動しないものであるかを判定する。
【０１７３】
図１８は、世代別ＧＣによって、メモリに記憶したデータが移動する様子の一例を示す模式図である。
例えば、世代別ＧＣにおいては、新世代領域のデータは頻繁に移動するが、旧世代領域のデータは頻繁に移動しない。
したがって、メモリ配置判定部６６０は、そのアドレスから、そのメモリが新世代領域であるか旧世代領域であるかを判断することにより、頻繁に移動するか否かを判定する。
なお、メソッドの参照解決のためには、クラス名やメソッド名からメソッドのプログラム格納位置を指定する参照テーブル（メソッドテーブル）がある。
メソッドテーブルについても、ここで説明したのと同様、インストラクションおよび関連する参照用情報から読み取ったメソッド名により、メソッドテーブル内のインデックスを取得することでメソッドの参照解決を行うと共に、インストラクションを書き換える構成とすることができる。
この場合、書き換えられたインストラクションのオペランドとして、メソッドテーブルのインデックスを書き込む。本発明では、メソッドに関しても、メソッドが格納されたデータ格納領域のアドレスをオペランドに設定した命令に書き換えを行う。
【０１７４】
実施の形態６．
実施の形態６を、図１、図２、図１５、図１９、図２０を用いて説明する。
【０１７５】
この実施の形態におけるプログラム実行装置６００（記憶管理装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態５において図１、図２、図１５を用いて説明したプログラム実行装置６００と同様であるから、ここでは説明を省略する。
【０１７６】
図１９は、この実施の形態において、プログラム実行装置６００が、インストラクション格納部６１０が記憶したプログラムを実行する際の、処理の流れの一例を示すフローチャート図である。
図２０は、この実施の形態において、インストラクション格納部６１０、クラスファイル情報管理部６２０、テーブル管理部６４０が記憶する内容の一例を示す図である。
【０１７７】
Ｓ７１〜Ｓ７３、Ｓ７５〜Ｓ７８は、参照解決のための処理である。
この実施の形態では、実施の形態５と異なり、インストラクションを実行しながら、未解決の参照が要求された段階で、参照解決を行なう方式を採っている。
しかし、起動時にあらかじめ参照解決処理を行う構成としてもよい。
【０１７８】
Ｓ７９において、インストラクション実行部６３０は、インストラクション（コマンドの一例）がオペランド（対象識別子の一例）としてデータ格納アドレスをとるものであるか否かを判断する。
後述するように、オペランドが参照番号６１２（データ識別子の一例）ではなく、データ格納アドレス（記憶識別子の一例）を直接指定する場合には、データ操作命令６１１（データ操作指令識別子の一例）をデータ操作命令６１６（記憶操作指令識別子の一例）に書き換えてある。
したがって、インストラクション実行部６３０は、データ操作命令が何であるかを判定することにより、オペランドが参照番号であるか、データ格納アドレスであるかを判断する。
インストラクション実行部６３０は、データ格納アドレスが指定されていると判断した場合には、Ｓ８３に進み、インストラクションの実行手続を行う。
インストラクション実行部６３０は、データ格納アドレスが指定されていないと判断した場合には、Ｓ８０に進む。
【０１７９】
Ｓ８０において、インストラクション実行部６３０は、テーブルを辿ることにより、データ格納アドレスを求める。
この例でいえば、参照番号６１２が「６」であるから、クラスファイル情報管理部６２０がメモリ６９０に記憶したコンスタントプールの参照番号「６」を見る。
次に、フィールドテーブルインデックス６２２が「３５」であるから、テーブル管理部６４０がメモリ６９０に記憶したフィールドテーブルの参照番号「３５」を見る。
そして、データ格納アドレス６４１が「ＡＢＣＤ」であるから、これが、そのフィールドのデータを記憶したメモリ６９０のアドレスであることがわかる。
【０１８０】
Ｓ８１において、メモリ配置判定部６６０は、そのデータ格納アドレスが移動の多い領域に配置されているかを判定する。
メモリ配置判定部６６０は、そのデータ格納アドレスが移動の多い領域に配置されていると判定した場合には、Ｓ８３に進み、インストラクションを実行する。
メモリ配置判定部６６０は、そのデータ格納アドレスが移動の多い領域に配置されていないと判定した場合には、Ｓ８２に進む。
【０１８１】
Ｓ８２において、インストラクション格納部６１０は、算出したデータ格納アドレスをオペランドして設定し、インストラクションの書き換えを行う。
すなわち、参照番号６１２をデータ格納アドレス６１７に書き換えるとともに、データ操作命令６１１をデータ操作命令６１６に書き換える。
【０１８２】
Ｓ８３において、インストラクション実行部６３０は、インストラクションを実行する。
Ｓ８４において、インストラクション実行部６３０は、プログラム実行の終了か否かを判断し、終了でない場合には、Ｓ７４に戻る。
【０１８３】
これにより、データを操作する際、コンスタントプールを参照せず、データ格納アドレスに直接アクセスできるので、プログラムの実行速度が更に向上するという効果を奏する。
【０１８４】
実施の形態７．
実施の形態７を、図１、図２、図１５、図２１、図２２を用いて説明する。
【０１８５】
この実施の形態におけるプログラム実行装置６００（記憶管理装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態５において図１、図２、図１５を用いて説明したプログラム実行装置６００と同様であるから、ここでは説明を省略する。
【０１８６】
この実施の形態は、メモリ再配置ＧＣ部６８０（データ移動部の一例）の動作に特徴がある。
【０１８７】
図２１は、この実施の形態において、メモリ再配置ＧＣ部６８０がコンパクション処理を行う際の、処理の流れの一例を示すフローチャート図である。
【０１８８】
Ｓ９１において、メモリ再配置ＧＣ部６８０は、全ヒープメモリ領域（メモリ６９０のうち、ＧＣの対象となる記憶領域）について、Ｓ９２〜Ｓ９４の処理を行う。
【０１８９】
Ｓ９２において、メモリ再配置ＧＣ部６８０は、その記憶領域が記憶したデータがクラスインスタンスであるか、オブジェクトインスタンスであるかを判断する。
例えば、使用するメモリ領域に使用用途を示すヘッダを付加しておき、その値によってクラスインスタンスであるかオブジェクトインスタンスであるかを判断する。
【０１９０】
メモリ再配置ＧＣ部６８０は、その記憶領域が記憶したデータがクラスインスタンスであると判断した場合、Ｓ９３に進む。
メモリ再配置ＧＣ部６８０は、その記憶領域が記憶したデータがオブジェクトインスタンスであると判断した場合、Ｓ９４に進む。
【０１９１】
Ｓ９３において、メモリ再配置ＧＣ部６８０は、その記憶領域をクラスインスタンスを記憶した記憶領域として、再配置リストに追加する。
【０１９２】
Ｓ９４において、メモリ再配置ＧＣ部６８０は、その記憶領域をオブジェクトインスタンスを記憶した記憶領域として、再配置リストに追加する。
【０１９３】
ここで、再配置リストとは、データの種類、現在のデータ格納アドレス、ＧＣ後のデータ格納アドレスを記憶するテーブルである。この段階では、ＧＣ後のデータ格納アドレスは未定なので、空欄にしておく。
【０１９４】
メモリ再配置ＧＣ部６８０は、Ｓ９２〜Ｓ９４の処理を全ヒープメモリ領域について繰りかえす。
【０１９５】
Ｓ９５において、メモリ再配置ＧＣ部６８０は、再配置先の決定を行なう。
すなわち、再配置リストを先頭から読み込み、データの種類がクラスインスタンスであるものについて、先に再配置先のアドレスを決定する。
次に、それ以外のデータについて、再配置先のアドレスを決定する。
アドレスの決定は、最初に再配置先のメモリ６９０の先頭アドレスから始めて、１つ決定するたびに、そのアドレスに決定したデータのサイズを足して、次の再配置先を求める。データのサイズは、例えば、使用するメモリ領域に設けたヘッダによって判別する。
決定した再配置先アドレスは、再配置リストに記憶する。
【０１９６】
Ｓ９６において、メモリ再配置ＧＣ部６８０は、全ヒープメモリ領域について、Ｓ９７〜Ｓ９８の処理を繰り返す。
【０１９７】
Ｓ９７において、メモリ再配置ＧＣ部６８０は、再配置リストに基づいて、データを移動させるか否かを判断し、移動させる場合には、各メモリ領域の内容をコピーして、コンパクション後のアドレスにデータを移動する。
【０１９８】
Ｓ９８において、メモリ再配置ＧＣ部６８０は、データを移動させた場合、そのデータに対する参照を書き換えて、正しく参照できるように整合させる。
例えば、実施の形態５及び実施の形態６において、図１７及び図２０を用いて説明したように、テーブル管理部６４０（対応関係記憶部の一例）がメモリ６９０に記憶したフィールドテーブル（対応関係）は、データ格納アドレス６４１（記憶識別子の一例）を記憶している。
メモリ再配置ＧＣ部６８０は、このデータ格納アドレス６４１を、再配置後のデータ格納アドレスに変更する。
また、メモリ再配置ＧＣ部６８０は、クラスファイル情報管理部６２０がメモリ６９０に記憶したクラスファイル情報のデータ格納アドレス６２３、インストラクション格納部６１０がメモリ６９０に記憶したインストラクションのデータ格納アドレス６１７も、同様に書き換える。
あるいは、クラスファイル情報やインストラクションは、もとの状態に戻してもよい。
例えば、インストラクションを書き換えたときに書き換えた場所及び書換前のデータをメモリ６９０に別に記憶しておき、それに基づいて書換え、あるいは、書き戻しをする。
【０１９９】
図２２は、この実施の形態において、コンパクション処理によってメモリ６９０が記憶したデータが移動する様子の一例を示す模式図である。
【０２００】
このように、クラスインスタンスとオブジェクトインスタンスとを区別して、再配置することにより、図２２に示すように、クラスインスタンスがメモリ領域の先頭にくる。
これに対し、従来の方式で、クラスインスタンスとオブジェクトインスタンスとを区別しないで再配置すると、クラスインスタンスとオブジェクトインスタンスとが混在する状態になる。
【０２０１】
この段階では、移動するデータの量は、どちらの方式によってもあまり変わらない。
【０２０２】
しかし、クラスインスタンスがメモリ領域の先頭にあると、次回のＧＣ時には、クラスインスタンスを移動させる必要がない。クラスインスタンスは、プログラムの実行が終了するまで解放されないからである。
【０２０３】
したがって、この方式のＧＣによれば、ＧＣによるデータの移動を少なくすることができるという効果を奏する。
【０２０４】
ＧＣにおいて、データを移動させると、データをコピーする手間以外に、そのデータについての参照をすべて書き換えて、参照を整合させなければならず、そのための処理に時間がかかる。
【０２０５】
この実施の形態において、データの格納アドレスに対する直接参照は、フィールドテーブルだけでなく、クラスファイル情報や、インストラクションの中にも点在するので、データの移動はできるだけ少ないほうがよい。
【０２０６】
したがって、このＧＣ方式は、実施の形態５などによって説明した方式と組み合わせることにより、プログラムの実行速度を、更に、大幅に向上させるという効果を奏する。
【０２０７】
実施の形態８．
実施の形態８を、図１、図２、図１８、図２３、図２４を用いて説明する。
【０２０８】
この実施の形態におけるプログラム実行装置６００（記憶管理装置の一例）の外観、ハードウェア構成は、実施の形態１において図１、図２を用いて説明した記憶管理装置１００と同様であるから、ここでは説明を省略する。
【０２０９】
図２３は、この実施の形態におけるプログラム実行装置６００の機能ブロックの構成の一例を示すブロック構成図である。
図２３において、プログラム実行装置６００は、インストラクション格納部６１０、クラスファイル情報管理部６２０、インストラクション実行部６３０、テーブル管理部６４０、参照解決部６５０、メモリ配置判定部６６０、動的メモリ確保部６７０、世代別ＧＣ部６８５、メモリ６９０を有する。
このうち、インストラクション格納部６１０、クラスファイル情報管理部６２０、インストラクション実行部６３０、テーブル管理部６４０、参照解決部６５０、メモリ配置判定部６６０、動的メモリ確保部６７０、メモリ６９０の動作は、実施の形態５において、図１５を用いて説明したものと同様なので、ここでは説明を省略する。
【０２１０】
世代別ＧＣ部６８５（データ移動部の一例）は、世代別ＧＣアルゴリズムを用いて、ＧＣを行なう。
【０２１１】
図１８は、この実施の形態において、コンパクション処理によってメモリ６９０が記憶したデータが移動する様子の一例を示す模式図である。
【０２１２】
世代別ＧＣでは、メモリ領域を複数の世代領域に分割して管理する。この例では、新世代領域と旧世代領域の２つに分けて管理している。
世代別ＧＣでは、基本的に、新世代領域についてＧＣを行なう。そして、新世代領域をＧＣしただけではメモリ領域が足りなくなった場合に、旧世代領域についてＧＣを行なう。
したがって、世代別ＧＣでは、旧世代領域のデータは、移動することが少ない。
【０２１３】
メモリ配置判定部６６０は、データ格納アドレスが新世代領域にあるか、旧世代領域にあるかに基づいて、そのデータが移動の多い領域に格納されているか否かを判定する。
例えば、新世代領域と旧世代領域の境界のアドレスを記憶しておき、そのアドレスとデータ格納アドレスの大小関係を比較する比較器を設けることにより、簡単に判定が可能である。
【０２１４】
このように、旧世代のメモリ領域の回収及びコンパクション処理は頻繁に行われることはないため、旧世代に含まれるメモリ領域のデータ格納アドレスの変更は少ないと判断できる。また、旧世代と新世代の境界のアドレスを保持し、データ格納アドレスと比較することで安定的な位置に配置されたクラスインスタンス及びオブジェクトインスタンスであるかを容易に判断することができる。
【０２１５】
図２４は、この実施の形態において、世代別ＧＣ部６８５が旧世代領域のコンパクション処理を行う際の、処理の流れの一例を示すフローチャート図である。
【０２１６】
世代別ＧＣ部６８５は、新世代領域のＧＣを行なっても、動的メモリ確保部６７０が要求されたメモリ領域を確保できない場合に、旧世代領域のＧＣを行なう。
【０２１７】
Ｓ０１において、世代別ＧＣ部６８５は、全ヒープメモリ領域に対して、Ｓ０２の処理を行う。なお、処理の対象は、旧世代領域に限ってもよい。
【０２１８】
Ｓ０２において、世代別ＧＣ部６８５は、使用されている記憶領域を、再配置リストに追加する。
なお、この例では、記憶領域がクラスインスタンスかオブジェクトインスタンスかは区別しないので、再配置リストは、データの種類を記憶する必要はない。
【０２１９】
Ｓ０３において、世代別ＧＣ部６８５は、再配置リストに基づいて、配置先のアドレスを決定する。
アドレスの決定は、例えば、最初に再配置先のメモリ６９０の先頭アドレスから始めて、１つ決定するたびに、そのアドレスに決定したデータのサイズを足して、次の再配置先を求める。データのサイズは、例えば、使用するメモリ領域に設けたヘッダによって判別する。
求めたアドレスは、再配置リストに記憶する。
【０２２０】
Ｓ０４において、世代別ＧＣ部６８５は、全ヒープメモリ領域に対して、Ｓ０５〜Ｓ０６の処理を行う。なお、Ｓ０１で旧世代領域のみを対象とした場合には、Ｓ０４でも旧世代領域のみを対象とする。
【０２２１】
Ｓ０５において、世代別ＧＣ部６８５は、再配置リストに基づいて、現在のデータ格納アドレスと、再配置先のデータ格納アドレスとが一致するか否かを判断する。一致しない場合には、データを移動させる。
すなわち、現在のデータ格納アドレスからデータを読み出し、再配置先のアドレスに書き込む。
【０２２２】
Ｓ０６において、世代別ＧＣ部６８５は、データを移動させた場合に、そのデータに対する参照を書き換えて、参照を整合させる。
すなわち、テーブル管理部６４０（対応関係記憶部の一例）がメモリ６９０に記憶したフィールドテーブル、クラスファイル情報管理部６２０がメモリ６９０に記憶したクラスファイル情報、インストラクション格納部６１０がメモリ６９０に記憶したインストラクションなどの中で、メモリのデータ格納アドレスを直接参照している部分について、再配置後のデータ格納アドレスに書き換える。
【０２２３】
あるいは、クラスファイル情報、インストラクションは、命令を書き換える前の状態に戻してもよい。
【０２２４】
世代別ＧＣのように、データの移動を頻繁に行なう領域と、そうでない領域とが簡単に区別できるＧＣを使うことにより、データの移動頻度が簡単に判定できるので、命令の書換え等によってプログラムの実行速度を速くすることができる。
【０２２５】
ＧＣによってデータを移動させた場合には、そのデータを記憶しているメモリ６９０のデータ格納アドレスを直接指定して参照している場所を、すべて書き換える必要があるが、このように、世代別ＧＣを使うことにより、移動しない領域が多くなるので、書換えにかかる手間が減り、ＧＣ処理を含めた全体としてプログラムの実行速度が速くなるという効果を奏する。
【０２２６】
以上説明したプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを保持する手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２２７】
また、このプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを、実行用プログラムへのリンク情報内に保持する手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２２８】
あるいは、このプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを、実行用プログラムの命令を書き換えると共にオペランドに保持する手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２２９】
このプログラム実行装置は、更に、
ガーベージコレクションのメモリコンパクション時に、シンボルのデータを格納するアドレスの変更が少なくするようにメモリ領域の配置を行う手段を備えるガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３０】
このプログラム実行装置は、更に、
ガーベージコレクションのメモリコンパクション時に、シンボルのデータを格納するアドレスの変更が少なくするようにクラスインスタンスを移動しない領域である前方に集めるメモリ領域の配置を行う手段を備えるガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３１】
このプログラム実行装置は、更に、
メモリ配置判定手段は、世代別ガーベージコレクションの旧世代領域をアドレス変更が少なくなるように配置されたと判断するガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３２】
このプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを保持する手段とガーベージコレクションは、解決済みシンボルのデータ格納領域のアドレスが無効となった際に保持する解決済みシンボルのデータ格納領域のアドレスを廃棄する手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３３】
また、このプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを、実行用プログラムへのリンク情報内に保持する手段と、
ガーベージコレクションは、解決済みシンボルのデータ格納領域のアドレスが無効となった際に実行用プログラムへのリンク情報内の解決済みシンボルのデータ格納領域のアドレスを廃棄する手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３４】
あるいは、このプログラム実行装置は、
解決済みシンボルのデータ格納領域のアドレス変更が少なくなるように配置されたことを判断する手段と、
前記手段の判断結果に基づき、解決済みシンボルのデータ格納領域のアドレスを、実行用プログラムの命令を書き換えると共にオペランドに保持する手段と、
ガーベージコレクションは、解決済みシンボルのデータ格納領域のアドレスが無効となった際に実行用プログラムの命令のオペランドに保持した解決済みシンボルのデータ格納領域のアドレスを廃棄し、実行用プログラムの命令を書き換えると共にインデックス等の間接参照のオフセットに書きかえる手段を備えることを特徴とするガーベージコレクションを行うインタプリタ型プログラム実行装置である。
【０２３５】
以上説明したように、インタプリタ型のプログラム実行装置では、実行速度を向上するために、命令自体の書き換えとオペランドをシンボル情報から数値情報への変更が行われる共に、クラステーブル、フィールドテーブル、メソッドテーブルに対して、新たにオブジェクトオフセット、クラステーブルインデックス、ネームインデックス、タイプインデックス、アクセスフラグなどの情報が各テーブルに追加される。追加される情報は全て各テーブルのインデックスまたはオフセットであり、情報を格納したアドレスを追加していない。そのため、実際の情報を取得、変更するためには、オブジェクトの先頭アドレスにオフセットを加算して情報を格納したアドレスを求めるアドレス計算を行う必要がある。このオフセットとテーブルの先頭アドレスを加算するアドレス計算は、頻繁に行われるために命令の実行速度を低下させる原因となっている。
【０２３６】
このプログラム実行装置は、上記のような課題を解決できる。
【０２３７】
ここで、オフセットを格納しなければならない理由は、プログラム実行装置が、メモリコンパクションを伴うガーベージコレクションを行うプログラム実行装置であるからである。メモリコンパクションを伴うガーベージコレクションを行うプログラム実行装置では、オブジェクト、クラス内のフィールド、メソッドのアドレスは、メモリコンパクションが実施された場合には変更されるため、それらのアドレスを格納している箇所は書き換える必要がある。そのため、フィールドやメソッドのアドレスの参照を極力少なくすることがガーベージコレクションの処理時間を短縮することにつながる。
上記のように、メモリコンパクションを伴うガーベージコレクションを行うインタプリタ型プログラム実行装置においては、ガーベージコレクションの処理時間を短くするために、参照または設定するデータの格納アドレスをテーブルとオフセットという形式で保存している。しかし、その反面、テーブルの先頭アドレスとオフセットを加算するアドレス計算が行われることで命令の実行速度を低下させている。
【０２３８】
このプログラム実行装置は、上記のような課題を解決できる。
【０２３９】
すなわち、解決済みシンボルのデータ格納領域のアドレスを保持する手段とデータ格納領域のアドレスが特定されたことを利用する命令に書き換える手段を備えることで、テーブルの先頭アドレスとオフセットを加算するアドレス計算が不要となり、命令の実行速度を向上させることができる。
【０２４０】
また、ガーベージコレクションのメモリコンパクション時に、シンボルのデータを格納するアドレスの変更が少なくするようにメモリ領域の配置を行う手段とアドレスの変更が少なくなるように配置されたことを判断する手段を設けることで、ガーベージコレクションのメモリコンパクションが頻繁に発生し、アドレスが変更される状況においては、データ格納領域をテーブルの先頭アドレスとオフセットにより求める命令とすることができ、ガーベージコレクション時にデータ格納領域のアドレスを書き換える処理を行わないことによるガーベージコレクションの処理時間の遅くなることがない。
【図面の簡単な説明】
【０２４１】
【図１】実施の形態１〜実施の形態４における記憶管理装置１００の外観の一例を示す図。
【図２】実施の形態１〜実施の形態４における記憶管理装置１００のハードウェア構成の一例を示す図。
【図３】実施の形態１における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図４】実施の形態１において、記憶管理装置１００が記憶領域確保処理を行なう際の、処理の流れの一例を示すフローチャート図。
【図５】実施の形態１において、記憶領域２０１〜２２０のグループ分けと、そこに記憶するデータの内容の一例を示す図。
【図６】実施の形態１において、ＧＣを行なって、再利用可能な記憶領域を探し、記憶領域が記憶したデータを移動させることによって、確保できる記憶領域を増やす場合の動作の一例を示す図。
【図７】実施の形態２における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図８】実施の形態２において、記憶管理装置１００がデータ移動処理を行なう際の、処理の流れの一例を示すフローチャート図。
【図９】実施の形態２において、記憶領域２０１〜２２０が記憶するデータの内容の一例を示す図。
【図１０】実施の形態３における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図１１】実施の形態３において、記憶管理装置１００が対象識別子書換処理を行なう際の、処理の流れの一例を示すフローチャート図。
【図１２】実施の形態４における記憶管理装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図１３】実施の形態４において、拡張したバイトコードのオペコード５７１とオペランド５７２の意味（一部）の一例を示す図。
【図１４】実施の形態４において、記憶管理装置１００がコマンド書換処理を行う際の、処理の流れの一例を示すフローチャート図。
【図１５】実施の形態５〜実施の形態７におけるプログラム実行装置６００の機能ブロックの構成の一例を示すブロック構成図。
【図１６】実施の形態５において、プログラム実行装置６００が、インストラクション格納部６１０が記憶したプログラムを実行する際の、処理の流れの一例を示すフローチャート図。
【図１７】実施の形態５において、インストラクション格納部６１０、クラスファイル情報管理部６２０、テーブル管理部６４０が記憶する内容の一例を示す図。
【図１８】世代別ＧＣによって、メモリに記憶したデータが移動する様子の一例を示す模式図。
【図１９】実施の形態６において、プログラム実行装置６００が、インストラクション格納部６１０が記憶したプログラムを実行する際の、処理の流れの一例を示すフローチャート図。
【図２０】実施の形態６において、インストラクション格納部６１０、クラスファイル情報管理部６２０、テーブル管理部６４０が記憶する内容の一例を示す図。
【図２１】実施の形態７において、メモリ再配置ＧＣ部６８０がコンパクション処理を行う際の、処理の流れの一例を示すフローチャート図。
【図２２】実施の形態７において、コンパクション処理によってメモリ６９０が記憶したデータが移動する様子の一例を示す模式図。
【図２３】実施の形態８におけるプログラム実行装置６００の機能ブロックの構成の一例を示すブロック構成図。
【図２４】実施の形態８において、世代別ＧＣ部６８５が旧世代領域のコンパクション処理を行う際の、処理の流れの一例を示すフローチャート図。
【図２５】ＪａｖａＶＭが実行するクラスファイル５００の一例を示す図。
【図２６】メソッド情報５５０に含まれるバイトコード５８０の一部と、コンスタントプール情報５２０の内容の一例を示す図。
【図２７】ＪａｖａＶＭが実行するクラスファイルで使われるバイトコード（コマンドの一例）のオペコード５７１（操作指令識別子の一例）とオペランド５７２（対象識別子の一例）の意味（一部）を示す図。
【符号の説明】
【０２４２】
１００  記憶管理装置、１１０  記憶装置、１２１  領域確保要求取得部、１２２  空き領域判断部、１２３  領域確保部、１２４  記憶識別子記憶部、１３１  種別取得部、１３２  種別判断部、１３３  データ割振り部、１４２  領域判断部、１４３  データ移動部、１４４  記憶識別子書換部、１５１  記憶識別子取得部、１５３  データ操作部、１６０  識別子記憶部、１６１  識別子情報記憶部、１６２  対象識別子記憶部、１６３  対応関係記憶部、１６５  識別子書換部、１６６  識別子情報書換部、１６７  対象識別子書換部、１７１  対象識別子判断部、１７２  対象記憶領域算出部、１７３  対象記憶領域判断部、１８０  コマンド記憶部、１８１  操作指令記憶部、１８５  コマンド書換部、１８６  操作指令書換部、１９１  操作指令解読部、１９２  操作対象識別部、１９３  操作実行部、２０１〜２２０  記憶領域、２５０  定義情報記憶領域、２５１〜２５３  定義情報、２６０  実体情報記憶領域、２６１〜２６７  実体情報、５００  クラスファイル、５１０  ヘッダー、５２０  コンスタントプール情報、５３０  クラス情報、５４０  フィールド情報、５５０  メソッド情報、５６０  属性情報、５２１  エントリー数、５２２〜５２９  コンスタントプール（＃１〜＃ｎ）、５９１  タグ、５９２  内容、５９３  番号、５８０  バイトコード、５８１  データ操作命令、５８２  参照番号、５７１  オペコード、５７２  オペランド、６００  プログラム実行装置、６１０  インストラクション格納部、６２０  クラスファイル情報管理部、６３０  インストラクション実行部、６４０  テーブル管理部、６５０  参照解決部、６６０  メモリ配置判定部、６７０  動的メモリ確保部、６８０  メモリ再配置ＧＣ部、６８５  世代別ＧＣ部、６９０  メモリ、６１１，６１３，６１６  データ操作命令、６１２  参照番号、６１７  データ格納アドレス、６２１  コンスタントプールの内容、６２２  フィールドテーブルインデックス、６２３，６４１  データ格納アドレス、９０１  ＣＲＴ、９０２  Ｋ／Ｂ、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９０７  スキャナ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信ボード、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９３１  電話器、９３２  ＦＡＸ機、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ。
【図１】
0004773143.tif 000002
【図２】
0004773143.tif 000003
【図３】
0004773143.tif 000004
【図４】
0004773143.tif 000005
【図５】
0004773143.tif 000006
【図６】
0004773143.tif 000007
【図７】
0004773143.tif 000008
【図８】
0004773143.tif 000009
【図９】
0004773143.tif 000010
【図１０】
0004773143.tif 000011
【図１１】
0004773143.tif 000012
【図１２】
0004773143.tif 000013
【図１３】
0004773143.tif 000014
【図１４】
0004773143.tif 000015
【図１５】
0004773143.tif 000016
【図１６】
0004773143.tif 000017
【図１７】
0004773143.tif 000018
【図１８】
0004773143.tif 000019
【図１９】
0004773143.tif 000020
【図２０】
0004773143.tif 000021
【図２１】
0004773143.tif 000022
【図２２】
0004773143.tif 000023
【図２３】
0004773143.tif 000024
【図２４】
0004773143.tif 000025
【図２５】
0004773143.tif 000026
【図２６】
0004773143.tif 000027
【図２７】
0004773143.tif 000028