(57)【要約】【課題】インタプリタ及び動的コンパイラを備える言語処理実行において、任意のアプリケーションに適用可能なメモリ不足時のフェールセーフ機構を実現すること。【解決手段】縮退運転開始部１１７、縮退運転終了部１１８により、メモリ不足発生時に動的コンパイルコード実行用のメモリ領域１１３の一部を、入力プログラム用メモリ領域１０９に組み入れることにより、部分的な実行性能低下だけでシステム全体の実行を継続させ、通常運転への復帰を可能とする。【選択図】      図１
2006323763.tif 000002
【特許請求の範囲】
【請求項１】
入力されたユーザプログラムに対するインタプリタ実行部及び動的コンパイラ実行部を備える言語処理実行システムにおける言語処理実行方法において、前記入力されたユーザプログラムからのメモリ確保要求に応じて、入力プログラム用メモリの確保を行う際にメモリ不足が発生した場合、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリ領域の一部を、前記入力プログラム用メモリの領域に組み入れ、その際、動的コンパイルコード実行用のメモリ領域の前記入力プログラム用メモリの領域に組み入れられる領域に存在した動的コンパイルコード情報を無効化して縮退運転を開始させることを特徴とする言語処理実行方法。
【請求項２】
前記縮退運転は、インタプリタ実行部による入力プログラムの実行継続を自動的に行う運転であることを特徴とする請求項１記載の言語処理実行方法。
【請求項３】
前記縮退運転を開始した後、前記動的コンパイルコード実行用のメモリ領域から前記入力プログラム用メモリの領域に組み入れたメモリを再び動的コンパイラ実行部が使用できるようにすることにより通常運転に復帰させることを特徴とする請求項１記載の言語処理実行方法。
【請求項４】
システム起動時のオプション指定や設定ファイルによって、前記メモリ不足の発生時に、自動的に縮退運転を開始して実行を継続するか否か、及び、縮退運転開始時に前記動的コンパイルコード実行用のメモリ領域から前記入力プログラム用メモリの領域に組み入れるメモリ領域量を設定可能とすることを特徴とする請求項１記載の言語処理実行方法。
【請求項５】
前記縮退運転を開始した後、システム起動時のオプション指定や設定ファイルによって、自動的に縮退運転を終了するか否か、及び、自動的な縮退運転の終了を行う条件を設定可能とすることを特徴とする請求項１記載の言語処理実行方法。
【請求項６】
入力されたユーザプログラムに対するインタプリタ実行部及び動的コンパイラ実行部を備える言語処理実行システムにおいて、入力プログラム用メモリと、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリと、前記入力プログラムからのメモリ確保要求に応じて前記入力プログラム用メモリの確保を行うメモリ確保部と、前記メモリの確保におけるメモリ不足発生時に、前記動的コンパイルコード実行用のメモリ内の動的コンパイル実施形態を無効化して、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリ領域の一部を、前記入力プログラム用メモリの領域に組み入れて縮退運転を開始させる縮退運転開始部とを備えることを特徴とする言語処理実行システム。
【請求項７】
前記縮退運転は、インタプリタ実行部による入力プログラムの実行継続を自動的に行う運転であることを特徴とする請求項６記載の言語処理実行システム。
【請求項８】
前記縮退運転を開始した後、前記動的コンパイルコード実行用のメモリ領域から前記入力プログラム用メモリの領域に組み入れたメモリを再び動的コンパイラ実行部が使用できるようにすることにより通常運転に復帰させる縮退運転終了部を備えることを特徴とする請求項６記載の言語処理実行システム。
【請求項９】
システム起動時のオプション指定や設定ファイルによって、前記メモリ不足の発生時に、自動的に縮退運転を開始して実行を継続するか否か、及び、縮退運転開始時に前記動的コンパイルコード実行用のメモリ領域から前記入力プログラム用メモリの領域に組み入れるメモリ領域量を設定可能とすることを特徴とする請求項６記載の言語処理実行システム。
【請求項１０】
前記縮退運転を開始した後、システム起動時のオプション指定や設定ファイルによって、自動的に縮退運転を終了するか否か、及び、自動的な縮退運転の終了を行う条件を設定可能とすることを特徴とする請求項６記載の言語処理実行システム。
【請求項１１】
入力されたユーザプログラムに対するインタプリタ実行部及び動的コンパイラ実行部を備える言語処理実行システムにおける言語処理実行を行う言語処理実行プログラムを格納した記録媒体であって、前記入力されたユーザプログラムからのメモリ確保要求に応じて、入力プログラム用メモリの確保を行う際にメモリ不足が発生した場合、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリ領域の一部を、前記入力プログラム用メモリの領域に組み入れる処理プログラムと、その際、動的コンパイルコード実行用のメモリ領域の前記入力プログラム用メモリの領域に組み入れられる領域に存在した動的コンパイルコード情報を無効化する処理プログラムと、その後に、縮退運転を開始させる処理プログラムが格納されたことを特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、言語処理実行方法及びシステムに係り、特に、インタプリタ及び動的コンパイラを備える言語処理実行システムにおいて、メモリ不足時フェールセーフ機構を実現することを可能とした言語処理実行方法及びシステムに関する。
【背景技術】
【０００２】
メモリ不足時のフェールセーフ機構に関する従来技術として、例えば、特許文献１等に記載された技術が知られている。この従来技術は、メモリにロードされている他のプロセスを選択して強制的にその使用メモリを解放するというものである。また、他の従来技術として、例えば、特許文献２等に記載された技術が知られている。この従来技術は、メモリ不足時にメモリを解放することができるように、予め余計に確保しておいたメモリを解放するためのリカバリ援助プログラムを起動するというものである。
【０００３】
また、インタプリタ及び動的コンパイラを備える言語処理実行システムに関する従来技術として、例えば、特許文献３等に記載された技術が知られている。この従来技術は、組み込み系Ｊａｖａ（登録商標、以後同様）ＴＭ仮想マシン（以下、ＪａｖａＶＭという）に関するものであり、ネットワークからロードしたクラスオブジェクトを通常とは別にリスト管理を行い、メモリ不足時にアンロードしてメモリを捻出するというものである。
【０００４】
また、インタプリタ及び動的コンパイラを備える言語処理実行システムに関する一般的な従来技術として、例えば、非特許文献１等に記載された技術が知られている。この従来技術は、実行頻度の高い部分について、インタプリタによる実行から動的コンパイラでコンパイルしたコードでの実行へ切り替えることにより実行性能の改善を図るというものである。そして、ＪａｖａＶＭにおいては、呼び出し回数等の履歴情報から実行頻度の高いメソッドを判定し、メソッド単位で実行方式の切り替えを行う方法が一般的である。
【特許文献１】特開２０００−２１５０９９号公報
【特許文献２】特開平６-２３１０３６号公報（特許０２７１３０７９）
【特許文献３】特開２０００−２５０７５７号公報
【非特許文献１】中田育男著「コンパイラの構成と最適化」朝倉書店、１９９９年９月２０日、Ｐ．２２１−２２６
【発明の開示】
【発明が解決しようとする課題】
【０００５】
前述した特許文献１に記載の従来技術は、他のプロセスを停止させるという問題点を発生させてしまい、また、特許文献２に記載の従来技術は、発生するかどうか判らないメモリ不足のためだけに余計にメモリを確保しておかなければならないという無駄を生ささせる問題点を有している。また、前述した特許文献３に記載のＪａｖａＶＭに関する従来技術も、一度アンロードしたクラスオブジェクトが再度必要となり、再ロードした場合、以前と同じクラスオブジェクトであるという保証がなく、たとえ同じであっても、ＪａｖａＶＭ内で以前と全く同じ状態としてロードできる保証もないため、任意のアプリケーションプログラムや高信頼性を必要とするアプリケーションプログラムの実行に適用できないという問題点を有している。
【０００６】
本発明の目的は、前述したような従来技術の問題点を解決し、インタプリタ及び動的コンパイラを備える言語処理実行において、任意のアプリケーションに適用可能なメモリ不足時のフェールセーフ機構を実現することを可能とした言語処理実行方法及びシステムを提供することにある。
【課題を解決するための手段】
【０００７】
本発明によれば前記目的は、入力されたユーザプログラムに対するインタプリタ実行部及び動的コンパイラ実行部を備える言語処理実行システムにおける言語処理実行方法において、前記入力されたユーザプログラムからのメモリ確保要求に応じて、入力プログラム用メモリの確保を行う際にメモリ不足が発生した場合、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリ領域の一部を、前記入力プログラム用メモリの領域に組み入れ、その際、動的コンパイルコード実行用のメモリ領域の前記入力プログラム用メモリの領域に組み入れられる領域に存在した動的コンパイルコード情報を無効化して縮退運転を開始させることにより達成される。
【０００８】
また、前記目的は、入力されたユーザプログラムに対するインタプリタ実行部及び動的コンパイラ実行部を備える言語処理実行システムにおいて、入力プログラム用メモリと、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリと、前記入力プログラムからのメモリ確保要求に応じて前記入力プログラム用メモリの確保を行うメモリ確保部と、前記メモリの確保におけるメモリ不足発生時に、前記動的コンパイルコード実行用のメモリ内の動的コンパイル実施形態を無効化して、前記動的コンパイラ実行部が使用している動的コンパイルコード実行用のメモリ領域の一部を、前記入力プログラム用メモリの領域に組み入れて縮退運転を開始させる縮退運転開始部とを備えることにより達成される。
【発明の効果】
【０００９】
本発明によれば、インタプリタ及び動的コンパイラを備える言語処理実行において、任意のアプリケーションに適用可能なメモリ不足時のフェールセーフ機構を実現することができる。
【発明を実施するための最良の形態】
【００１０】
以下、本発明による言語処理実行方法及びシステムの実施形態を図面により詳細に説明する。なお、以下に説明する本発明の実施形態は、インタプリタ及び動的コンパイラを備える言語処理実行システムとしてＪａｖａＶＭを使用した場合の例である。
【００１１】
図１は本発明の一実施形態による言語処理実行システムの構成を示すブロック図であり、本発明の実施形態である言語処理実行システムとしてのＪａｖａＶＭが動作する計算機システムと各種データとを示している。図１において、１０１はＪａｖａソースプログラム、１０２はＪａｖａコンパイラ、１０３はＪａｖａクラスファイル、１０４は設定ファイル・オプション指定部、１０５は主記憶装置、１０６はＪａｖａＶＭ、１０７はメソッド実行部、１０８はメソッド読み取り部、１０９はＪａｖａヒープ領域、１１０はメソッド情報、１１１はインタプリタ部、１１２は動的コンパイラ部、１１３は動的コンパイルコードバッファ領域、１１４はバイトコード対応テーブル、１１５は動的コンパイルコード情報、１１６はメモリ確保部、１１７は縮退運転開始部、１１８は縮退運転終了部、１１９は縮退運転管理情報、１２０はＪａｖａヒープ管理情報、１２１は動的コンパイルコードバッファ管理情報、１２２はバス、１２３はプロセッサである。
【００１２】
図１に示す計算機システムは、ＪａｖａＶＭ１０６の実行を行うプロセッサ１２３と、ＪａｖａＶＭ１０６の本体がロードされ、各種領域が確保される主記憶装置１０５から構成され、バス１２２によって結合されて構成されている。主記憶装置１０５内には、ＪａｖａＶＭ１０６の本体が格納されると共に、メソッド情報１１０を格納するＪａｖａヒープ領域１０９と、バイトコード対応テーブル１１４及び動的コンパイルコード情報１１５を格納する動的コンパイルコードバッファ領域１１３とが設けられている。なお、Ｊａｖａヒープ領域１０９と、動的コンパイルコードバッファ領域１１３とは、ＪａｖａＶＭ１０６の構成要素として、ＪａｖａＶＭ１０６に含まれる。ＪａｖａＶＭ１０６の本体は、メソッド実行部１０７と、メモリ確保部１１６と、縮退運転開始部１１７と、縮退運転終了部１１８とにより構成される。また、メソッド実行部１０７は、メソッド読み取り部１０８と、インタプリタ部１１１と、動的コンパイラ部１１２とにより構成される。
【００１３】
ハードディスク装置等の記憶装置上に格納されているユーザプログラムであるＪａｖａソースプログラム１０１は、Ｊａｖａコンパイラ１０２により、ＪａｖａＶＭ１０６で解釈・実行することができる形式であるＪａｖａクラスファイル１０３に変換され、このＪａｖａクラスファイル１０３がＪａｖａＶＭ１０６に入力される。また、本発明の実施形態による言語処理実行システムの挙動を制御するために、設定ファイル・オプション指定部１０４から設定ファイルやオプション指定がＪａｖａＶＭ１０６に入力され、その内容が縮退運転管理情報１１９として記憶される。
【００１４】
ＪａｖａＶＭ１０６に入力されたＪａｖａクラスファイル１０３は、メソッド実行部１０７内のメソッド読み取り部１０８によって解析されメソッド情報１１０に作成されて、入力プログラム用メモリであるＪａｖａヒープ領域１０９内に格納される。Ｊａｖａヒープ領域１０９は、入力されたユーザプログラムが必要とするメモリ領域であり、本発明の実施形態におけるメモリ不足は、このＪａｖａヒープ領域が不足することを意味する。
【００１５】
前述において、通常、インタプリタ部１１１は、Ｊａｖａソースプログラム１０１から得られたメソッド情報１１０を読み込んで、インタプリタの実行を行う。インタプリタ部１１１がインタプリタの実行を繰り返すうちに、実行頻度が高いと判断されたメソッドに関して、動的コンパイラ部１１２は、メソッド情報１１０を読み込んで、動的コンパイルを行い、動的コンパイラ部１１２が使用するメモリ領域である動的コンパイルコードバッファ領域１１３内にバイトコード対応テーブル１１４及び動的コンパイルコード情報１１５を作成して、動的コンパイルコードの実行を行う。動的コンパイルコードバッファ領域１１３は、動的コンパイルコードに関する情報を保持するためだけに使用される領域である。
【００１６】
インタプリタ部１１１及び動的コンパイラ部１１２は、インタプリタ実行及び動的コンパイルコード実行中に、Ｊａｖｅソースプログラム１０１からメモリ確保命令があると、メモリ確保部１１６を呼び出して、Ｊａｖａヒープ領域１０９の内部からメモリの確保を行わせる。メモリ確保部１１６は、Ｊａｖａヒープ領域１０９のメモリ不足によりメモリの確保ができない場合、縮退運転開始部１１７を呼び出し、縮退運転開始部１１７は、縮退運転管理情報１１９、Ｊａｖａヒープ管理情報１２０、動的コンパイルコードバッファ管理情報１２１を参照・設定して、縮退運転を開始する。縮退運転終了部１１８は、メソッド実行部１０７から呼ばれ、縮退運転管理情報１１９、Ｊａｖａヒープ管理情報１２０、動的コンパイルコードバッファ管理情報１２１を参照・設定して、縮退運転を通常運転に戻す。ここで、縮退運転とは、本来、動的コンパイルコード実行により行うべき運転をインタプリタ実行による運転で行うことであり、縮退運転中は、新たな動的コンパイル処理が抑止される。
【００１７】
図８はメソッド情報１１０、動的コンパイルコード情報１１５、バイトコード対応テーブル１１４の内容の詳細を説明する図であり、ここで、これらの情報について説明する。
【００１８】
図８（ａ）に示すメソッド情報１１０は、メソッド毎にＪａｖａヒープ領域１０９内に必ず作成される情報であり、動的バイトコード情報へのポインタ８０１とバイトコード列８０２とにより構成される。動的バイトコード情報へのポインタ８０１のフィールドは、そのメソッドが動的コンパイルされていない場合に“０”を保持し、動的コンパイルコードが存在する場合には、動的コンパイルコード情報１１５のアドレスを保持している。バイトコードとは、Ｊａｖａプログラムの内容を表現する各命令のことであり、バイトコード列８０２には、そのメソッド内に書かれた命令の列が書き込まれ、これを参照してユーザプログラムのインタプリタ実行が行われる。
【００１９】
図８（ｂ）に示す動的コンパイルコード情報１１５及び図８（ｃ）に示すバイトコード対応テーブル１１４は、そのメソッドが動的コンパイルされた際に、動的コンパイルコードバッファ領域１１３内に作成される。そして、図８（ｂ）に示す動的コンパイルコード情報１１５は、有効／無効フラグ８０３と、バイトコード対応テーブルへのポインタ８０４と、機械語コード列８０５とにより構成される。有効／無効フラグ８０３は、その動的コンパイルコードが有効か無効かを表すフラグであり、この情報が作成されると有効に設定される。バイトコード対応テーブルへのポインタ８０４は、バイトコード対応テーブル１１４のアドレスを保持する。機械語コード列８０５には、そのメソッドを動的コンパイルした結果の機械語コードの列が書き込まれ、この機械語コード列８０５をプロセッサ１２３が直接実行することにより、ユーザプログラムの動的コンパイルコード実行が行われる。
【００２０】
図８（ｃ）に示すバイトコード対応テーブル１１４は、動的コンパイルコード実行における機械語コード列８０５内の命令アドレスに対応するバイトコード列８０２内のバイトコードのインデクス格納したテーブルである。
【００２１】
図９は縮退運転管理情報１１９を保持するテーブルの内容を説明する図であり、次に、これについて説明する。
【００２２】
縮退運転管理情報１１９は、縮退運転中フラグ９０１と、縮退運転自動開始フラグ９０２と、縮退運転開始時組み入れメモリ量９０３と、縮退運転自動終了フラグ９０４と、縮退運転自動終了条件９０５とにより構成される。
【００２３】
縮退運転中フラグ９０１のフィールドは、その値が“０”であれば通常運転中を表し、“１”であれば縮退運転中を表すフィールドであり、起動時には“０”に初期化される。縮退運転自動開始フラグ９０２のフィールドは、メモリ不足発生時に自動的に縮退運転を開始するか否かを表すフラグのフィールドであり、その値が“０”であれば自動的には縮退運転を開始しないことを表し、“１”であれば自動的に縮退運転を開始することを表す。縮退運転開始時組み入れメモリ量９０３のフィールドは、縮退運転開始時に、動的コンパイルコードバッファ領域１１３からＪａｖａヒープ領域１０９へと組み入れるメモリ量を算出するために参照されるフィールドであり、メモリ量やメモリ領域全体量に対する比率等で表現される。縮退運転自動終了フラグ９０４のフィールドは、縮退運転開始後、自動的に縮退運転を終了させるか否かを表すフラグであり、その値が“０”であれば自動的には縮退運転を終了しないことを表し、“１”であれば自動的に縮退運転を終了することを表す。縮退運転自動終了条件９０５のフィールドは、縮退運転を自動的に終了させる条件を表現する。縮退運転中フラグ９０１以外の９０２、９０３、９０４、９０５の各フィールドの内容は、ユーザが作成し、システム起動時に入力した設定ファイルや起動時のオプション指定部１０４によって、ユーザが設定可能である。
【００２４】
図１０はＪａｖａヒープ領域１０９と動的コンパイルコードバッファ領域１１３とを管理するための管理情報テーブルの内容の詳細及び縮退運転時の領域移動について説明する図である。なお、本発明の実施形態では、Ｊａｖａヒープ領域１０９と動的コンパイルコードバッファ領域１１３とは連続した領域であるものとする。
【００２５】
Ｊａｖａヒープ管理情報１２０は、図１０（ａ）に示すように、Ｊａｖａヒープ領域１０９の先頭１００１と末端１００２とを保持し、動的コンパイルコードバッファ管理実施形態は、動的コンパイルコードバッファ領域１１３の先頭１００３と末端１００４とを保持している。Ｊａｖａヒープ管理情報１２０内の先頭１００１のフィールド及び末端１００２のフィールドは、それぞれ、Ｊａｖａヒープ領域１０９の先頭と末端とのアドレスを保持している。同様に、動的コンパイルコードバッファ管理情報１２１内の先頭１００３のフィールド及び末端１００４のフィールドは、それぞれ、動的コンパイルコードバッファ領域１１３の先頭と末端とのアドレスを保持している。前述したように、Ｊａｖａヒープ領域１０９と動的コンパイルコードバッファ領域１１３とは連続した領域であるので、Ｊａｖａヒープ領域１０９の末端１００２のフィールドのアドレスと、動的コンパイルコードバッファ領域１１３の先頭１００３のフィールドのアドレスとは、同一のアドレス値を持っている。
【００２６】
縮退運転により、動的コンパイルコードバッファ領域１１３の一部がＪａｖａヒープ領域１０３に移されると、動的コンパイルコード情報が無効化される。図１０（ｂ）に示す無効化される動的コンパイルコード情報１００５は、縮退運転時に無効化される動的コンパイルコード情報の範囲を表しており、詳細な意味は、図５に示すフローチャートの説明の中で後述する。
【００２７】
図２はメソッド実行部１０７のメソッド実行の処理動作を説明するフローチャートであり、次に、これについて説明する。なお、図２に示すフローは、メソッド実行の前処理を中心としたものである
（１）メソッド実行部１０７は、各メソッドの初回呼び出し時のみ、入力されたＪａｖａクラスファイル１０３を元にして、対象メソッドのメソッド情報１１０をＪａｖａヒープ領域１０９内に作成する（ステップ２０１）。
【００２８】
（２）次に、そのメソッドがすでに動的にコンパイルされていて、有効な動的コンパイルコードが存在するか否かを、図８に（ａ）に示して説明したメソッド情報１１０内の動的コンパイルコード情報へのポインタ８０１をたどり、図８（ｂ）に示す動的コンパイルコード情報１１５内の有効／無効フラグ８０３を参照して判定する（ステップ２０２）。
【００２９】
（３）ステップ２０２の判定で、有効な動的コンパイルコードが存在した場合、それを元に動的コンパイルコード実行を行う。なお、この動的コンパイルコード実行の処理については、図３に示すフローを参照して後述する（ステップ２０８）。
【００３０】
（４）ステップ２０２の判定で、有効な動的コンパイルコードが存在しなかった場合、次に、図９に示して説明した縮退運転管理情報１１９内の縮退運転中フラグ９０１を参照して、縮退運転中か否かを判定する（ステップ２０３）。
【００３１】
（５）ステップ２０３の判定で、縮退運転中であった場合、インタプリタ部１１１がメソッド情報１１０を参照してインタプリタ実行を行う。このインタプリタ実行は、縮退運転中に、新たな動的コンパイルを行わず、動的コンパイルコードバッファ領域１１３を消費することがないようにするためである。なお、インタプリタ実行の処理については、図３に示すフローを参照して後述する（ステップ２０７）。
【００３２】
（６）ステップ２０３の判定で、縮退運転中でなかった場合、そのメソッドが動的コンパイル条件を満たすか否かを判定する。この判定の方法としては、種々の方法が知られており、任意の方法で判定することができる。そして、そのメソッドが動的コンパイル条件を満たさない場合、インタプリタ実行を行う（ステップ２０４、２０７）。
【００３３】
（７）ステップ２０４の判定で、そのメソッドが動的コンパイル条件を満たしていた場合、そのメソッドを動的コンパイルして、動的コンパイルコードバッファ領域１１３内に動的コンパイルコード情報１１５とバイトコード対応テーブル１１４とを作成し、メソッド情報１１０内の動的コンパイルコード情報へのポインタ８０１フィールドにそのアドレスを保持させて、動的コンパイルコード実行を行う（ステップ２０５、２０６、２０８）。
【００３４】
（８）ステップ２０７でのインタプリタ実行、及び、ステップ２０８での動的コンパイルコード実行によるメソッド本体の実行が終了した後、メソッド実行後処理を実行する。なお、メソッド実行後処理については、図６に示すフローを参照して後述する（ステップ２０９）。
【００３５】
図３はインタプリタ実行及び動的コンパイルコード実行によるメソッド本体の実行処理の動作を説明するフローチャートであり、次に、これについて説明する。
【００３６】
（１）インタプリタ実行、動的コンパイルコード実行、いずれの場合も、メソッド本体の実行は、メソッドに含まれる命令種別に応じた処理を命令順番どおりに実行することにより行われる。そして、処理が開始されると、まず、命令がメモリ確保命令か否かを判定する（ステップ３０１）。
【００３７】
（２）ステップ３０１の判定で、命令がメモリ確保命令でなかった場合、次に、命令がその他の命令であるか否かを判定し、その他の命令であった場合、命令種別を適切に判定して、判定した命令に応じた処理を実行する（ステップ３０５、３０６）。
【００３８】
（３）ステップ３０１の判定で、命令がメモリ確保命令であった場合、メモリ確保部１１６を呼び出して、メモリの確保を行わせた後、メモリ確保が成功したか否かを判定する。なお、命令確保部１１６でのメモリ確保処理については、図４に示すフローを参照して後述する（ステップ３０２、３０３）。
【００３９】
（４）ステップ３０３の判定で、メモリ確保に失敗していた場合、メモリ不足エラーが発生したので、メソッドの実行を中断する（ステップ３０４）。
【００４０】
（５）ステップ３０３の判定で、メモリ確保に成功していた場合、ステップ３０５の判定で、命令がその他の命令でなかった場合、または、ステップ３０６の処理の終了後、メソッド内の命令が終了したかを判定し、命令の終了でなかった場合、ステップ３０１からの処理に戻って処理を繰り返し、命令の終了であった場合、ここでの処理を終了する（ステップ３０７）。
【００４１】
図４はメモリ確保部１１６によるメモリ確保処理の動作を説明するフローチャートであり、次に、これについて説明する。
【００４２】
（１）まず、Ｊａｖａヒープ管理情報１２０内を参照して、要求されたメモリ量をＪａｖａヒープ領域１０９内に確保できるか否かを判定し、メモリに空きがあり、メモリを確保可能であれば、メモリを確保して、メモリ確保処理の呼び出し元に対してメモリの確保を応答して、ここでの処理を終了する（ステップ４０１、４０７）。
【００４３】
（２）ステップ４０１の判定で、メモリに空きがなく、Ｊａｖｅヒープ領域１０９内からメモリを確保できない場合、１度、メモリ中の不要な領域を回収して使用可能にするGarbage Collection（ＧＣ）処理を行い、再度、Ｊａｖｅヒープ領域１０９内からメモリを確保できるか否かを判定する（ステップ４０２、４０３）。
【００４４】
（３）ステップ４０３の判定で、ステップ４０２でのＧＣ処理によって、領域が空いて、メモリを確保可能になった場合、メモリを確保して、メモリ確保処理の呼び出し元に対してメモリの確保を応答して、ここでの処理を終了する（ステップ４０７）。
【００４５】
（４）ステップ４０３の判定で、メモリが確保できなかった場合、図９に示す縮退運転管理情報１１９内の縮退運転自動開始フラグ９０２を参照して、自動的に縮退運転を開始してよいか否かを判定し、開始できない場合、メモリの確保失敗となり、その旨を呼び出し元に通知して、ここでの処理を終了する（ステップ４０４、４０８）。
【００４６】
（５）ステップ４０４の判定で、自動的に縮退運転を開始してよい場合、縮退運転開始部を呼び出して、実際に縮退運転を開始する。なお、縮退運転開始処理については、図５に示すフローを参照して後述する（ステップ４０５）。
【００４７】
（６）縮退運転開始後、再度、Ｊａｖａヒープ領域内にメモリを確保できるか否かを判定し、メモリを確保可能であれば、メモリを確保して、メモリ確保処理の呼び出し元に対してメモリの確保を応答する前述したステップ４０７の処理に移行し、メモリが確保できなければ、確保失敗を呼び出し元に通知する前述したステップ４０８の処理に移行する（ステップ４０６）。
【００４８】
図５は縮退運転開始部１１７による縮退運転開始処理の動作を説明するフローチャートであり、次に、これについて説明する。
【００４９】
（１）まず、縮退運転開始部１１７は、図９に示して説明した縮退運転管理情報１１９内の縮退運転中フラグ９０１を“１”に設定し、縮退運転を開始することをシステム全体に伝え、ここでの処理を行うスレッド以外の全てのスレッドを停止する（ステップ５０１、５０２）。
【００５０】
（２）縮退運転管理情報１１９内の縮退運転開始時組み入れメモリ量９０３に基づき、実際に不足しているメモリ量を最低値として、動的コンパイルコードバッファ領域１１３からＪａｖａヒープ領域１０９に組み入れるメモリ量を算出して決定する（ステップ５０３）。
【００５１】
（３）動的コンパイルコードバッファ領域１１３からＪａｖａヒープ領域１０９に組み入れるメモリ内には、通常、すでに動的コンパイルコード情報１１５とバイトコード対応テーブル１１４とが存在しているが、この領域のＪａｖａヒープ領域１０９への組み入れに伴い、これらの情報は使用できなくなる。このため、組み入れる領域内にある動的コンパイルコード情報１１５内の有効／無効フラグ８０３を無効に設定すると共に、そのメソッドのメソッド情報１１０内の動的コンパイルコード情報へのポインタ８０１も“０”に設定し直すことにより、その動的コンパイルコード情報を無効化する（ステップ５０４）。
【００５２】
（４）次に、ステップ５０３の処理で決定した、組み入れるメモリ量だけ、実際に動的コンパイルコードバッファ領域１１３からＪａｖａヒープ領域１０９へ組み入れて、Ｊａｖａヒープ領域１０９を拡張する。この処理は、動的コンパイルコードバッファ管理情報１２１内の先頭１００３を、組み入れるメモリ量だけ大きい値に設定し直し、同様に、Ｊａｖａヒープ管理情報１２０内の末端１００２を、組み入れるメモリ量だけ大きい値に設定し直すことにより行う（ステップ５０５）。
【００５３】
（５）ステップ５０４の処理によって無効化された動的コンパイルコード情報１００５、及び、ステップ５０５の処理によるＪａｖａヒープ領域１０９と動的コンパイルコードバッファ領域１１３との変化の様子を図１０（ｂ）に示している。無効化される動的コンパイルコード情報１００５内に存在する機械語コード列８０５を実行している途中で停止したスレッドに関しては、動的コンパイルコード実行中だった命令のアドレス（＝停止アドレス）に対応するバイトコード列８０２内のバイトコードのインデクスを、バイトコード対応テーブル１１４を引いて求め、対応するバイトコードからインタプリタ実行により再開できるように環境設定を行う（ステップ５０６）。
【００５４】
（６）最後に、停止させた全スレッドを再開することにより、システムを縮退運転に移行する（ステップ５０７）。
【００５５】
図６はメソッド実行部によるメソッド実行処理のうちメソッド本体の実行終了後の後処理（図２のステップ２０９の処理）の動作を説明するフローチャートであり、次に、これについて説明する。
【００５６】
（１）まず、図９に示す縮退運転管理情報１１９内の縮退運転中フラグ９０１を参照して、縮退運転中か否かを判定し、縮退運転中でなければ、何も行わずに、ここでの処理を終了する（ステップ６０１）。
【００５７】
（２）ステップ６０１の判定で、縮退運転中であった場合、縮退運転自動終了フラグ９０４を参照して、自動的に縮退運転を終了してもよいか否かを判定し、終了できない場合、何も行わずに、ここでの処理を終了する（ステップ６０２）。
【００５８】
（３）ステップ６０２の判定で、自動的に縮退運転を終了してもよい場合、縮退運転自動終了条件９０５を参照して、設定された縮退運転の終了条件が満たされているか否かを判定し、終了条件が満たされていなかった場合、何も行わずに、ここでの処理を終了する（ステップ６０３）。
【００５９】
（４）ステップ６０２の判定で、終了条件が満たされていた場合、縮退運転終了部１１８を呼び出し、縮退運転終了処理を実行した後に、ここでの処理を終了する（ステップ６０４）。
【００６０】
図７は縮退運転終了部１１８による縮退運転終了処理の動作を説明するフローチャートであり、次に、これについて説明する。
【００６１】
（１）まず、ここでの処理を行うスレッド以外の全てのスレッドを停止する（ステップ７０１）。
【００６２】
（２）次に、縮退運転開始時にＪａｖａヒープ領域１０９に組み入れたメモリ領域を元の動的コンパイルコードバッファ領域１１３に戻すために、Ｊａｖａヒープ管理情報１２０内の末端１００２を縮退運転開始前の値に戻し、同様に、動的コンパイルコードバッファ管理情報１２１内の先頭１００３も縮退運転開始前の値に戻す（ステップ７０２）。
【００６３】
（３）最後に、縮退運転管理情報１１９内の縮退運転中フラグ９０１を“０”に再設定し、全スレッドを再開することにより、システムを通常運転に戻して、処理を終了する（ステップ７０３、７０４）。
【００６４】
前述した本発明の実施形態での各処理は、プログラムとして構成してシステム内に備えられているプロセッサに実行させることができ、また、このプログラムは、ＦＤ、ＣＤ、ＭＯ、ＤＶＤＲＯＭ等の記録媒体に格納して提供することができ、また、ネットワークを介してディジタル情報により提供することができる。
【００６５】
前述した本発明の実施形態によれば、入力プログラム用メモリであるＪａｖａヒープ領域のメモリ不足発生時に、Ｊａｖａヒープ領域と動的コンパイルコード実行用のメモリ領域である動的コンパイルコードバッファ領域との間のメモリ配分を自動的に調整することができ、システム全体のダウンを防止して、実行を継続させることができる。
【００６６】
また、本発明の実施形態によれば、縮退運転を開始した後、メモリ不足の原因となっているアプリケーションプログラムをつきとめ、このアプリケーションプログラムのみを停止させて通常運転に戻すという機会を生み出すことが可能となるため、システムの可用性を向上させ、高い信頼性を持つシステムを構築することができ、さらに、アプリケーションの性質に応じて、縮退運転を行う際の縮退の度合いや、通常運転に戻す際の挙動を選択することができる。
【００６７】
前述した本発明の実施形態は、縮退運転を開始した後、システム起動時のオプション指定や設定ファイルによって、自動的に縮退運転を終了するか否か、及び、自動的な縮退運転の終了を行う条件を設定可能とすることがてきるものとして説明したが、本発明は、縮退運転を開始した後、入力されたユーザプログラムや本発明の実施形態による言語処理実行システム以外のシステムや人により縮退運転を終了させることができるインタフェースを備えるように構成することもできる。
【図面の簡単な説明】
【００６８】
【図１】本発明の一実施形態による言語処理実行システムの構成を示すブロック図である。
【図２】メソッド実行部によるメソッド実行の処理動作を説明するフローチャートである。
【図３】インタプリタ実行及び動的コンパイルコード実行によるメソッド本体の実行処理の動作を説明するフローチャートである。
【図４】メモリ確保部によるメモリ確保処理の動作を説明するフローチャートである。
【図５】縮退運転開始部による縮退運転開始処理の動作を説明するフローチャートである。
【図６】メソッド実行部によるメソッド実行処理のうちメソッド本体の実行終了後の後処理の動作を説明するフローチャートである。
【図７】縮退運転終了部による縮退運転終了処理の動作を説明するフローチャートである。
【図８】メソッド情報、動的コンパイルコード情報、バイトコード対応テーブルの内容の詳細を説明する図である。
【図９】縮退運転管理情報を保持するテーブルの内容を説明する図である。
【図１０】Ｊａｖａヒープ領域と動的コンパイルコードバッファ領域とを管理する管理情報テーブルの内容の詳細及び縮退運転時の領域移動について説明する図である。
【符号の説明】
【００６９】
１０１  Ｊａｖａソースプログラム
１０２  Ｊａｖａコンパイラ
１０３  Ｊａｖａクラスファイル
１０４  設定ファイル・オプション指定部
１０５  主記憶装置
１０６  ＪａｖａＶＭ
１０７  メソッド実行部
１０８  メソッド読み取り部
１０９  Ｊａｖａヒープ領域
１１０  メソッド情報
１１１  インタプリタ部
１１２  動的コンパイラ部
１１３  動的コンパイルコードバッファ領域
１１４  バイトコード対応テーブル
１１５  動的コンパイルコード情報
１１６  メモリ確保部
１１７  縮退運転開始部
１１８  縮退運転終了部
１１９  縮退運転管理情報
１２０  Ｊａｖａヒープ管理情報
１２１  動的コンパイルコードバッファ管理情報
１２２  バス
１２３  プロセッサ
【図１】
2006323763.tif 000003
【図２】
2006323763.tif 000004
【図３】
2006323763.tif 000005
【図４】
2006323763.tif 000006
【図５】
2006323763.tif 000007
【図６】
2006323763.tif 000008
【図７】
2006323763.tif 000009
【図８】
2006323763.tif 000010
【図９】
2006323763.tif 000011
【図１０】
2006323763.tif 000012