(57)【特許請求の範囲】
【請求項１】
仮想マシン・コードまたはインタープリットされたコードを最適化するための方法であって、
複数のプログラム命令と第１のタイプの非実行可能情報である第１の外来情報とを含むコードであって、仮想マシンによる実行のための言語で書かれたコードを受け取るステップと、
前記第１の外来情報を除去し、前記第１の外来情報のロケーションを参照するキーでもって前記第１の外来情報を置換することによって前記コードを修正するステップと、
修正コードを実行し、実行中に前記第１の外来情報を要求する事象が生じた場合、前記事象に応答して、前記キーを使って前記ロケーションにおける前記第１の外来情報を見つけ、前記ロケーションから前記第１の外来情報をロードするステップと
を含む、方法。
【請求項２】
前記事象は障害であり、前記第１のタイプの非実行可能情報はデバッグ情報である、請求項１に記載の方法。
【請求項３】
例外処理プロセスをインターセプトし、前記キーを使って前記例外処理プロセスを前記第１の外来情報のロケーションにリダイレクトするよう、前記複数のプログラム命令のうちの１つまたは複数個を修正するステップを更に含む、請求項２に記載の方法。
【請求項４】
前記コードは第２の外来情報を含み、第２の外来情報は第２のタイプの非実行可能情報であり、前記第１のタイプおよび前記第２のタイプの非実行可能情報は異なる、請求項１に記載の方法。
【請求項５】
前記第２のタイプの非実行可能情報はソース情報または注釈情報である、請求項４に記載の方法。
【請求項６】
前記コードはJava（登録商標）クラス・ファイルまたはJavaArchive（ＪＡＲ）ファイルであり、前記複数のプログラム命令はJavaバイトコード命令である、請求項１に記載の方法。
【請求項７】
前記コードは.NETコード・ファイルであり、前記複数のプログラム命令はCommonIntermediate Language（ＣＩＬ）バイトコード命令である、請求項１に記載の方法。
【請求項８】
前記言語はインタープリットされた言語である、請求項１に記載の方法。
【請求項９】
前記ロケーションは記憶ロケーションであり、
前記除去された第１の外来情報を前記記憶ロケーションに格納するステップを更に含む、
請求項１に記載の方法。
【請求項１０】
前記ロケーションは前記コードが格納される記憶ロケーションであり、前記ロードするステップは前記記憶ロケーションから前記コードをロードする、請求項１に記載の方法。
【請求項１１】
前記ロケーションは前記コードが検索され得るロケーションであり、前記ロードするステップは前記ロケーションから前記コードを検索する、請求項１に記載の方法。
【請求項１２】
コンピュータ上で実行されるコンピュータ可読プログラムであって、
複数のプログラム命令と第１のタイプの非実行可能情報である第１の外来情報とを含むコードであって、仮想マシンによる実行のための言語で書かれたコードを前記コンピュータに受け取らせ、
前記第１の外来情報を除去し、前記第１の外来情報のロケーションを参照するキーでもって前記第１の外来情報を置換することによって前記コードを前記コンピュータに修正させ、
修正コードを前記コンピュータに実行させ、実行中に前記第１の外来情報を要求する事象が生じた場合、前記事象に応答して、前記キーを使って前記ロケーションにおける前記第１の外来情報を前記コンピュータに見つけさせ、前記ロケーションから前記第１の外来情報を前記コンピュータにロードさせる
コンピュータ可読プログラム。
【請求項１３】
前記事象は障害であり、前記第１のタイプの非実行可能情報はデバッグ情報であり、
例外処理プロセスをインターセプトし、前記キーを使って前記例外処理プロセスを前記第１の外来情報のロケーションにリダイレクトするよう、前記複数のプログラム命令のうちの１つまたは複数個を前記コンピュータに修正させる、請求項１２に記載のコンピュータ可読プログラム。
【請求項１４】
前記ロケーションは記憶ロケーションであり、
前記除去された第１の外来情報を前記記憶ロケーションに、前記コンピュータに格納させる、請求項１２に記載のコンピュータ可読プログラム。
【請求項１５】
前記ロケーションは前記コードが格納されるロケーションまたは前記コードが検索され得るロケーションであり、前記ロードすることは前記ロケーションから前記第１の外来情報を含む前記コードをロードすることを含む、請求項１２に記載のコンピュータ可読プログラム。
【請求項１６】
前記仮想マシンはCommon Language Runtime（ＣＬＲ）仮想マシンである、請求項１２に記載のコンピュータ可読プログラム。
【請求項１７】
前記仮想マシンはJava VirtualMachine（ＪＶＭ）である、請求項１２に記載のコンピュータ可読プログラム。
【請求項１８】
前記言語はJavaScript（登録商標）である、請求項１７に記載のコンピュータ可読プログラム。
【請求項１９】
前記コンピュータ可読プログラムはコンピュータ使用可能光学的記憶媒体に格納される、請求項１２に記載のコンピュータ可読プログラム。
【請求項２０】
前記コンピュータ可読プログラムはハード・ディスクに格納される、請求項１２に記載のコンピュータ可読プログラム。
【請求項２１】
複数のプログラム命令と第１のタイプの非実行可能情報である第１の外来情報とを含むコードであって、仮想マシンによる実行のための言語で書かれたコードをロードするためのロジックと、
前記第１の外来情報を除去し、前記第１の外来情報のロケーションを参照するキーでもって前記第１の外来情報置換することによって前記コードを修正するためのロジックと、
修正コードを実行し、実行中に前記第１の外来情報を要求する事象が生じた場合、前記事象に応答して、前記キーを使って前記第１の外来情報を前記ロケーションにおいて見つけ、前記ロケーションから前記第１の外来情報をロードするためのロジックと
で構成されたプロセッサを含む、システム。
【請求項２２】
前記事象は障害であり、前記第１のタイプの非実行可能情報はデバッグ情報であり、
前記プロセッサは、例外処理プロセスをインターセプトし、前記キーを使って前記例外処理プロセスを前記第１の外来情報のロケーションにリダイレクトするよう、前記複数のプログラム命令のうちの１つまたは複数個を修正するためのロジックで構成される、請求項２１に記載のシステム。
【請求項２３】
前記ロケーションは記憶ロケーションであり、
前記プロセッサは、前記除去された第１の外来情報を前記記憶ロケーションに格納するためにロジックで構成される、請求項２１に記載のシステム。
【請求項２４】
前記ロケーションは前記コードが格納されるロケーションまたは前記コードが検索され得るロケーションであり、前記ロードすることは前記ロケーションから前記第１の外来情報を含む前記コードをロードすることを含む、請求項２１に記載のシステム。
【請求項２５】
前記仮想マシンはCommon Language Runtime（ＣＬＲ）仮想マシンまたはJava Virtual Machine（ＪＶＭ）である、請求項２１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般的には仮想マシン・コードに関し、詳しくいえば、外部からの情報（以下、外来情報という）を実行可能なコードから区分けすることによる仮想マシン・コードのメモリ最適化に関する。
【背景技術】
【０００２】
仮想マシン技術の利点が広く認識されるようになった。これらの利点の中には、単一のホスト・プラットフォーム上で複数の仮想マシンを稼動させる機能がある。その機能は、各ユーザが「完全な」コンピュータの特徴を楽しむことを保証すると同時にハードウェアの潜在的可能性をより十分に活用するものである。コンピュータ・ソフトウェアの増大する複雑性と、日常生活およびビジネスにおけるソフトウェア・システムに関して高まる信頼性とによって、ソフトウェア実行における高いパフォーマンスがユーザによって期待されるようになった。仮想マシン・ソフトウェアのパフォーマンスは特に重要である。それは、このソフトウェアが、多くの場合、メモリ制約を受ける、例えば、従来のコンピュータ・システムよりも少ないメモリを持つ傾向のあるＰＤＡやスマートフォンのようなワイヤレス装置であるシステム上で稼動されるためである。したがって、ネイティブ・ファンクション・コールを最小にしたり、ネイティブ・コードで提示される機能のタイプを制限したり、アプリケーション・サイズを縮小したり、効率的なコーディングを要求したりするような、ランタイム中の仮想マシン・コードによるメモリ使用量を減らす努力がなされてきた。メモリ使用量を減少させることは、依然として、最適なソフトウェア・パフォーマンスに対する重要な目標である。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
従って、本発明の目的は、仮想マシン・コードまたはインタープリットされたコードを最適化するのための方法、コンピュータ・プログラム、およびシステムを提供することにある。
【課題を解決するための手段】
【０００４】
本発明の方法は、複数のプログラム命令と第１の外来情報とを含むコードを受け取るステップであって、そのコードが仮想マシンによる実行のための言語で書かれており、第１の外来情報が第１のタイプの非実行可能な情報である、ステップと、第１の外来情報を除去し、第１の外来情報のロケーションを参照するキーでもって第１の外来情報を置換することによってコードを修正するステップと、その修正されたコード (以下、修正コードという)を実行し、実行中に第１の外来情報を要求する事象が生じた場合、事象に応答して、キーを使ってロケーションにおける第１の外来情報を見つけ、ロケーションから第１の外来情報をロードするステップとを含む。
【図面の簡単な説明】
【０００５】
【図１】本発明の実施例に従って、仮想マシンを含む例示的なコンピュータ・システムを示すブロック図である。
【図２】本発明の第１実施例に従って、例示的な区分け（partioning）およびメモリ最適化プロセスを示すブロック図である。
【図３】本発明の第１実施例に従って、例示的なJavaクラス・ファイルに関する図２の区分けプロセスの効果を示すブロックである。
【図４】本発明の第１実施例に従って、区分けおよびメモリ最適化プロセスを示すフローチャートである。
【図５】本発明の第１実施例に従って、区分けおよびメモリ最適化プロセスを示すフローチャートである。
【図６】本発明の第２実施例に従って、例示的な区分けおよびメモリ最適化プロセスを示すフローチャートである。
【図７】本発明の第２実施例に従って、例示的なJavaクラス・ファイルに関する図５の区分けプロセスの影響を示すブロック図である。
【図８】本発明の第２実施例に従って、区分けおよびメモリ最適化プロセスを示すフローチャートである。
【図９】本発明の第２実施例に従って、区分けおよびメモリ最適化プロセスを示すフローチャートである。
【発明を実施するための形態】
【０００６】
図面を参照すると、本発明の実施例による例示的なコンピュータ・システムが図１に示される。図１は、システム・バス１８によってコミュニケーション可能に連結された、プロセッサ１２、メモリ１４、ネットワーク・アダプタ１６およびJava（登録商標）仮想マシン２０を含むコンピュータ・システム１０を示す。メモリ１４は、任意の一般的なもしくはそれ以外のメモリまたは記憶装置（例えば、ＲＡＭ、キャッシュ、フラッシュ等）によって具現化され得るし、任意の適当な記憶容量を含み得る。ネットワーク・アダプタ１６は、コンピュータ・システム１０が、共用メモリを介してまたは他の適当な態様で、任意の数の任意の適当な通信媒体（例えば、ＷＡＮ、ＬＡＮ、インターネット、イントラネット、有線、無線等）によって１つまたは複数の他のシステムと通信し得るように具現化され得る。本実施例のコンピュータ・システムは、任意の一般的なもしくはそれ以外のプロトコルによってネットワークまたは他の通信チャンネルを介して通信するように一般的なもしくはそれ以外の通信装置を含み得るし、アクセスのために任意のタイプの接続（例えば、有線、無線）を利用し得る。
【０００７】
Java仮想マシン２０は、クラス・ローダ２１、例外ハンドラ・モジュール２２、エラー報告モジュール２３、実行エンジン２４、クラス・ライブラリ２７、およびメモリ２８のような種々のコンポーネントを含み、実行エンジン２４は、インタープリタ２５およびJust-in-Time（ＪＩＴ）コンパイラ２６を含む。仮想マシン２０は、本明細書ではJava仮想マシンとして論じられるが、本発明がJava技術に限定されないこと、および他の技術、およびCPython仮想マシン、.NETand Common Language Runtime、Parrot仮想マシン、Rubinius仮想マシン、または任意の他の適当な仮想マシンのような仮想マシンに関連して具現化され得ることは当然である。
【０００８】
クラス・ローダ２１はコード、例えば、Javaクラス（.class）もしくはJaveArchives（.jar）ファイル、またはCILバイトコード・ファイルのようなバイトコードをロードする。Sonoコードは、仮想マシンによる使用に適した任意の言語からコンパイルされたプログラム命令を含む。例えば、CPython仮想マシンによる使用に適した言語はPythonを含み、Java Virtual Machine（JVM）による使用に適した言語はJava、Clojure、Fan、Groovy、IBM（登録商標） NetRexx、JavaFXScript、JavaScript（登録商標）、JRuby、Jython、JScheme、Macromedia ColdFusion、Rhino、Scala等を含み、 .NET Common Language Runtime（CLR）による使用に適した言語はC#、C++/CLI、Cobra、F#、Fan、IronPython、IronRuby、J#、JScript.NET、ManagedJScript、Mondrian、Nemerle、VB.NET等を含み、Parrot仮想マシンによる使用に適した言語はPerl 6を含み、Rubinius仮想マシンによる使用に適した言語はRubyを含む。言語はインタープリットされた言語またはコンパイルされた言語であってもよく、例えば、JVMによる使用のための言語は普通にインタープリットされたJavaScriptまたは普通にコンパイルされたGroovyであってもよい。
【０００９】
コンピュータ・システム１０は、処理システムの形でまたはソフトウェアの形で具現化され得る。コンピュータ・システム１０は、任意の通常もしくは別のコンピュータ・システムまたは装置（例えば、コンピュータ端末、パーソナル・コンピュータ（例えば、IBM互換性のもの、Apple（登録商標） Macintosh（登録商標）、タブレット、ラップトップ等）等）、携帯電話、携帯情報端末（例えば、Palm Pre（登録商標）、Treo（登録商標）、iPhone（登録商標）等によって具現化され得るし、任意の市販のオペレーティング・システム（例えば、AIX（登録商標）、Linux（登録商標）、OSX（登録商標）、Sun（登録商標） Solaris（登録商標）、Unix（登録商標）、Windows（登録商標）等）および任意の市販のカスタム・ソフトウェア（例えば、ブラウザ・ソフトウェア、通信ソフト、ワード処理ソフトウェア等）を含み得る。これらのシステムは、情報を入力および／または表示するためのディスプレイおよび入力装置（例えば、キーボード、マウス、音声認識装置等）を含み得る。コンピュータ・システム１０は、それをソフトウェアで（例えば、仮想イメージとして）具現化する場合、記録可能な媒体（例えば、磁気的媒体、光学的媒体、フロッピ、ＤＶＤ、ＣＤ等）において、またはソースから通信媒体（例えば、電子掲示板、ネットワーク、ＬＡＮ、ＷＡＮ、イントラネット、インターネット等）を介してダウンロードするための搬送波または信号の形で利用可能である。
【００１０】
図２〜図５は、本発明の第１実施例の種々の態様を示す。この実施例では、コードは、実行可能なコードが正規のものとしてロードされるよう、および、必要なときだけ、外来情報がレージ・ロード（lazy-load）されるよう、実行可能なコードから外来情報を分離することおよび外来情報を個別に格納することによって区分けされる。この方法は、デバッグするためのプロセスおよびフィールドにおけるコードをサービスするために必要な他のプロセスのための外来情報のアクセシビリティを維持しながらメモリ・フットプリントを減少させることによってメモリ使用量を最適化する。
【００１１】
図２は、本発明の第１実施例に従って図１のシステムが遂行し得る例示的なパーティショニングおよびメモリ最適化プロセスを示す。このプロセスでは、Javaクラス・ファイルまたはCILコード・ファイルのようなコード３０が、そのコード３０における外来情報を識別するポスト・コンパイル・モジュール４０によって受け取られる。外来情報は非実行可能な情報、例えば、デバッグ情報２２１、注釈情報２２２、またはソース情報２２３である。コード３０は、修正コード３５を生じるために外来情報を削除することおよびその外来情報をデータベース６０、共用クラス・キャッシュのようなデータ記憶ロケーションに、またはネスト・インナー・クラスとしてもしくは個別のバイナリ・オブジェクトとして、格納することによって修正される。格納ロケーションを識別する一意的な識別キーが修正コード３５に挿入される。
【００１２】
ランタイムでは、修正コード３５が、正規のものとして、仮想マシン２０にロードされる。ランタイム中に外来情報に対する要求が存在する場合、システムは、特定のタスクに対して要求された適切なタイプの外来情報だけを見つけてロードし得る。例えば、障害が生じた場合、例外処理プロセス２２およびエラー報告機構２３が例外処理を実行してエラーを報告するためにデバッグ情報２２１を要求するが、注釈情報２２２およびソース情報２２３を必要としない。同様に、コードがリフレクションを使用する場合、リフレクション・プロセスがソース情報２２３を要求することはあるが、デバッグ情報２２１を要求することはしない。図示の例では、エラー報告機構２３は、スタック・トレース７０を生じさせるために４個の情報片、即ち、クラス、メソッド、ファイルおよび回線番号を要求するJavaスタック・トレース報告メソッドである。通常、この情報は、例外が形成されるとき、仮想マシンによって取り込まれるが、これらの実施例では、ファイルおよび回線番号が、データベース６０に格納されたデバッグ情報２２１の一部として除去された。従って、例外処理プロセス２２およびエラー報告機構は、デバッグ情報２２１が格納されている記憶ロケーション６０を見つけるためにキーを使用し、しかる後、スタック・トレース７０が取り込まれるようデバッグ情報２２１をロードする。
【００１３】
次に図３を参照すると、例示的なJavaクラス・ファイル３０が示され、そのファイル３０は、１０個の主要コンポーネント、即ち、マジック・ナンバ２０１、バージョン２０２、コンスタント・プール２０３、アクセス・フラグ２０４、当該クラス２０５、スーパ・クラス２０６、インターフェース２０７、フィールド２０８、メソッド２０９、また属性２１０を有する。属性は、デバッグ情報２２１、注釈情報２２２、およびソース情報２２３を含み得る。例示的なJavaクラス・ファイル３０は、それの外来情報、この場合、デバッグ情報２２１、注釈情報２２２、およびソース情報２２３を、プログラム命令から区分けさせて記憶ロケーション６０に格納させることにより、修正される。外来情報は、修正Javaクラス・ファイル３５におけるキー２２４によって置換される。なお、そのキーは、外来情報が格納される記憶ロケーションを識別する。
【００１４】
Java技術に関連して、デバッグ情報２２１は下記のような属性を含み得る。
SourceFile：（１つのクラス当たり）パスを持たないソース・ファイル名（例えば、ClassName.java）
SourceDebugExtension：一般的に未使用
LineNumberTable：（１メソッド当たり）デバッガがステップ・スルーすべき行数、および例外スタック・トレースが印刷すべき行数（バイトコード・インデックスをソース・ファイルにおける行数にマップする）
LocalVariableTable：（１メソッド当たり）ステップ中のデバッガに対するローカル変数の名前、
LocalVariableTypeTable：（１メソッド当たり）汎用タイプ（および汎用のものだけ）の場合、ソース・ファイルにおけるローカル変数のタイプがＶＭにおけるタイプとは異なる。例えば、ソース・ファイル・タイプが汎用のハッシュ・テーブル＜整数、ストリング＞であってもよいが、仮想マシンはハッシュ・テーブルを見るであろう。
この情報はコードにおけるプログラム命令の正規の実行には不必要である。これは、それが一般的にはデバッグおよびスタック・トレースのためにしか使用されず、稼動プログラムでは他のいずれにも使用されないためである。
【００１５】
Java技術に関連して、注釈情報２２２は、下記のような属性を含み得る。
AnnotationDefault、
RuntimeVisibleAnnotations、
RuntimeInvisibleAnnotations、
RuntimeVisibleParameterAnnotations、
RuntimeInvisibleParameterAnnotations
さらに、Java技術に関連して、ソース情報２２３は、下記のような属性を含み得る。
EnclosingMethod：:ローカル・クラスの囲みメソッドを識別する、
Signature： クラス、フィールド・タイプ、およびメソッドに対する汎用シグネチャを識別する、; 
Deprecated： 非推奨のアイテムを識別する、
Synthetic：コンパイラ生成アイテムを識別する、 
InnerClasses：内部および外部クラスの関係（ネストされたものおよび無名のものを含む）を識別する。
稼動中の仮想マシンはこの情報を必要としないので、この情報はコードにおけるプログラム命令の正規の実行にとって不必要である。この情報は一般にリフレクションのためにのみ使用される。従って、リフレクションを広範囲に利用するプログラムはこの情報の除去によって影響を受けることがあるが、一般には、ほとんどのプログラムが除去により影響されないであろう。
【００１６】
図４および図５を参照すると、第１実施例の区分けおよびメモリ最適化プロセスのためのプロセス３００および４００が概略的に示される。プロセス３００は、ランタイム（例えば、クラスがロードされるとき）以外の時間に実行され、プロセス４００は一般にランタイム時に行われ得る。プロセス３００では、システム、例えば、図１のシステムが、ステップ３１０において、例えば、ポスト・プロセッサによって解析されることによりコードを受け取り、ステップ３２０において、そのコードにおける外来情報を識別する。ステップ３３０において、システムはコードから外来情報を除去し、ステップ３４０においてデータ記憶ロケーションにその除去された外来情報を格納する。ステップ３５０において、システムは、外来情報のロケーションを参照するために、キーをコードに挿入する。IBM J９システムのようなシステムでは、このプロセスが、JavaOptimizer（JAPT）クラス操作ツールのようなツールによって行なわれ得る。
【００１７】
オプショナル・ステップ３６０において、システムは、例えば、例外処理プロセスを中断し且つキーを使ってそれを記憶ロケーションにリダイレクトするように、複数のプログラム命令のうちの１つまたは複数個を修正することによって外来情報を直接的ではなく間接的にアクセスするよう、そのコードを書き換える。プロセスは、別の方法で、例えば、Throwable.getStackTrace()、Class.getDeclaredAnnotations()、およびClass.getGenericInterfaces()のような格納された外来情報を透過的にロードする固有機能のオペレーションを変更するようにクラス・ライブラリを修正することによって行なわれ得るので、このステップ３６０はオプショナルである。例えば、スタック・トレースの場合、クラス・ライブラリは、プログラム・カウンタをStackTraceElementに格納するように修正され得る。プログラム・カウンタは、StackTraceElementによって表わされたメソッド呼び出しが生じるバイトコード命令へのインデックスであり、回線番号デバッグ情報構造において回線番号を見つけるために使用される。オプショナル・ステップ３７０において、その修正コードは、共用クラス・キャッシュのようなキャッシュ・メモリに格納され得るので、クラスのその後のロードは、如何なるロード時間ペナルティも減らすために共用クラス・キャッシュからであってもよい。
【００１８】
図５に示されるように、ランタイム中に、システムは、ステップ４１０において、その修正コードをロードし、しかる後、ステップ４２０において、外来情報を必要とする事象、例えば、障害またはリフレクション・プロセスが生じたかどうかを判断する。いずれも生じない場合、このプロセス４００は終了する。上記の事象が生じた場合、ステップ４３０において、システムはキーを使って記憶ロケーションにおける希望の外来情報を見つけ、ステップ４４０においてそれをロードする。しかる後、メモリ最適化プロセスは終了し、システムは、検索された外来情報を用いて任意の希望のアクションを行い得る。見つけられてロードされた外来情報は、１つまたは複数のタイプの外来情報、例えば、前述のデバッグ情報、注釈情報、またはソース情報であってもよい。システムは、特定の目的にとって望ましい外来情報だけを、例えば、そのシステムがスタック・トレースを作成している場合、それはそのスタック・トレースを取り込むために必要なデバッグ情報だけを見つけてロードし得るし、或いはそのシステムがリフレクションを使用する場合、それはリフレクションを遂行するために必要なソース情報だけを見つけてロードし得る。
【００１９】
図６〜図９は、本発明の第２実施例の種々の態様を示す。この実施例では、コードは、実行可能なコードと外来情報とを分離し、外来情報を廃棄することによって区分けされる。必要に応じて、外来情報はオリジナル・コードからロードされてもよい。この手法は、デバッグするための外来情報およびフィールドにおけるコードをサービスするために必要な他のプロセスのアクセシビリティを維持しながら、メモリ・フットプリントを減らすことによってメモリ使用量を最適化する。
【００２０】
図６は、本発明の第２実施例に従って、図１のシステムによって遂行され得る例示的な区分けおよびメモリ最適化プロセスを示す。このプロセスでは、Javaクラス・ファイルまたはCILコード・ファイルのようなコード３０が、コード３０における外来情報を識別する仮想マシン２０におけるカスタム・ローダ２１によって受け取られる。外来情報は非実行可能情報、例えばデバッグ情報、注釈情報、またはソース情報である。コード３０は、外来情報を除去することにより修正されて修正コード３５を創出し、オリジナル・コード３０のロケーションを識別する一意的な識別キーが修正コード３５に挿入される。
【００２１】
ランタイム時に、修正コード３５が仮想マシン２０に正規のものとしてロードされる。ランタイム中に外来情報に対する要求がある場合、システムは特定のタスクに必要な適切なタイプ外来情報だけを見つけてロードし得る。例えば、障害が生じた場合、例外処理プロセス２２およびエラー報告機構２３が例外処理を実行してエラーを報告するためにデバッグ情報を要求するが、注釈情報およびソース情報を必要としない。例外処理プロセス２２およびエラー報告機構２３は、オリジナル・コード３０が格納されている記憶ロケーションを見つけるためにキーを使用し、スタック・トレースが取り込まれるようファイルからデバッグ情報をロードする。同様に、コードがリフレクションを使用する場合、リフレクション・プロセスは、ソース情報を必要とするがデバッグ情報必要としないことがある。オリジナルのコードが生成されるかまたはサーバからダウンロードされてローカルに存在しない場合、それは再び再生成またはダウンロードされることもある。
【００２２】
次に図７を参照すると、例示的なJavaクラス・ファイル３０が示され、それは、１０個の一次的コンポーネント、即ち、マジック・ナンバ２０１、バージョン２０２、一定プール２０３、アクセス・フラグ２０４、当該クラス２０５、スーパ・クラス２０６、インターフェース２０７、フィールド２０８、メソッド２０９、および属性２１０を有する。属性は、デバッグ情報２２１、注釈情報２２２、およびソース情報２２３を含み得る。例示的なJavaクラス・ファイル３０は、それの外来情報、この場合には、デバッグ情報２２１、注釈情報２２２、およびソース情報２２３を、プログラム命令から区分けしてゴミ箱８０または収集された不要情報内に廃棄されることによって修正される。外来情報は、オリジナル・コード３０が格納されているロケーションまたは、例えば、ダウンロードによって検索可能であるロケーションを識別する、修正されたJavaクラス・ファイル３５におけるキー２２４により置換される。
【００２３】
次に図８および図９を参照すると、第２実施例の区分けおよびメモリ最適化プロセスのためのプロセス５００および６００が概略的に示される。プロセス５００は、ランタイム以外の時間に実行され得るか、またはランタイムに（例えば、クラスがロードされているときに）システムによって実行され得る。プロセス６００は、一般にランタイム時に遂行される。プロセス５００では、システム、例えば、図１のシステム）が、ステップ５１０において、例えば、オリジナル・コードを、クラス・ローダによりロードされることによってロードし、ステップ５２０においてそのコードにおける外来情報を識別する。ステップ５３０において、システムはそのコードから外来情報を除去し、ステップ５４０において、外来情報を含むオリジナル・コードが格納されるロケーションまたはそれが検索可能であるロケーションを参照するためにそのコードにキーを挿入する。IBM J９システムのようなシステムでは、このプロセスは、JavaOptimizer（JAPT）クラス操作ツールのようなツールによって行なわれ得るか、或いは、ランタイム時に、それは、拡張ローディング・プロセスの一部としてランタイムJ９システムによって遂行され得る。ラン・タイム・システムによって遂行されるとき、その修正コードは、仮想マシン内に格納されているコードおよび任意選択的にキャッシュ内に格納されているコードを表わすものである。
【００２４】
オプショナル・ステップ５５０において、システムは、例えば、例外処理プロセスを中断し且つキーを使ってその格納されたコードにそれをリダイレクトするように複数のプログラム命令のうちの１つまたは複数個を修正することによって、外来情報を直接的にアクセスする代わりに間接的にアクセスするよう、そのコードを書き換える。このステップはオプショナルである。というのは、そのプロセスは、別の方法で、例えば、Throwable.getStackTrace()、Class.getDeclaredAnnotations()、およびClass.getGenericInterfaces()のような格納されたコードから外来情報を透過的にロードすべくネイティブ機能のオペレーションを変更するようにクラス・ライブラリを修正することによって行われてもよいためである。例えば、スタック・トレースの場合、クラス・ライブラリはStackTraceElementにプログラム・カウンタを格納するように修正されてもよい。プログラム・カウンタは、StackTraceElementによって表わされるメソッド呼び出しが生じるバイトコード命令に対するインデックスであり、回線番号デバッグ情報構造において回線番号を見つけるために使用される。オプショナル・ステップ５６０において、その修正コードは共有クラス・キャッシュのようなキャッシュ・メモリに格納され得るので、クラスのその後のロードは、いずれのロード・タイム・ペナルティも減らすためには共有クラス・キャッシュからのものであってもよい。
【００２５】
図９に示されるように、ランタイム中、システムは、ステップ６１０において、修正コードをロードし、しかる後ステップ６２０において、外来情報を必要とする事象、例えば、障害またはリフレクション・プロセスが生じたかどうかを判断する。それが生じなかった場合、このプロセス６００は終了する。それが生じた場合、システムは、ステップ６３０において、オリジナル・コードが格納されているロケーションまたはそれが検索可能であるロケーションにおいて希望の外来情報を見つけるためにキーを使用し、ステップ６４０において、それをロードする。しかる後、メモリ最適化プロセスは終了し、システムは、検索された外来情報を用いて任意の希望のアクションを遂行し得る。その見つけられ且つロードされた外来情報は、前述の１つまたは複数のタイプの外来情報、例えば、デバッグ情報、注釈情報、およびソース情報であってもよい。システムは、特定の目的にとっては望ましい外来情報だけをロードし得る。例えば、システムがスタック・トレースを作成している場合、それは、そのスタック・トレースを取り込むために必要なデバッグ情報だけを見つけてロードし得るし、或いはシステムがリフレクションを使用する場合、それは、リフレクションを遂行するために必要なソース情報だけを見つけてロードし得る。
【００２６】
当業者には明らかなように、本発明の実施態様は、システム、方法、またはコンピュータ・プログラムとして具現化され得る。従って、本発明の実施態様は、全体的にハードウェアの実施例、全体的にソフトウェアの実施例（ファームウェア、駐在ソフトウェア、マイクロコード等を含む）、または、本明細書ではすべて「回路」、「モジュール」、もしくは「システム」として一般的に参照されるソフトウェアおよびとハードウェア態様を組み合わせた実施例の形式をとり得る。更に、本発明の実施態様は、コンピュータ可読プログラム・コードを具現化した１つまたは複数のコンピュータ可読媒体として具現化されたコンピュータ・プログラムの形式をとり得る。
【００２７】
１つまたは複数のコンピュータ可読媒体の任意の組み合わせが利用され得る。コンピュータ可読媒体は、コンピュータ可読信号媒体またはコンピュータ可読記憶媒体であってもよい。コンピュータ可読媒体は、例えば、電子的、磁気的、光学的、電磁気的、赤外線、もしくは、半導体システム、装置、またはデバイス、或いはそれらの任意の適切な組み合わせであってもよいが、それらに限定されない。コンピュータ可読記憶媒体の更に特殊な例（限定的リスト）は、下記のものを含むであろう。即ち、それは、１つまたは複数のワイヤ、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭもしくはフラッシュ・メモリ）、光ファイバ、ポータブル・コンパクト・ディスクを使った読取り専用メモリ（ＣＤ−ＲＯＭ）、光学的記憶装置、磁気記憶装置、または上記のものの任意の適切な組み合わせを有する電気的な接続を含むであろう。本明細書に関連して、コンピュータ可読記憶媒体は、命令実行システム、装置、またはデバイスによって或いはそれに関連して使用するためのプログラムを含むまたは格納することができる任意の実体的な媒体であってもよい。
【００２８】
コンピュータ可読信号媒体は、例えば、搬送波のベースバンドで、または搬送波の一部として、具現化されたコンピュータ可読プログラム・コードを備えた伝播データ信号を含み得る。そのような伝播信号は、電磁気的信号、光学的信号、またはそれの任意の適当な組み合わせを含むがそれに限定されない任意の様々な形式をとり得る。コンピュータ可読信号媒体は、命令実行システム、装置、またはデバイスによる使用、或いはそれらと関連した使用のためにプログラムを通信、伝播、または搬送することができる、コンピュータ可読記憶媒体ではない任意のコンピュータ可読媒体であってもよい。コンピュータ可読媒体上に具現化されたプログラム・コードは、無線、有線、光通信ケーブル、ＲＦ等またはそれらの任意の適当な組み合わせを含むがそれに限定されない任意の適切な媒体を使用して送信され得る。
【００２９】
本発明の実施態様に関するオペレーションを実行するためのコンピュータ・プログラム・コードは、Java、Smalltalk、C++等のようなオブジェクト指向プログラミング言語、およびを「C」プログラミング言語または同様のプログラミング言語のような従来の手続的なプログラミング言語あるいは同様のプログラミング言語を含む１つまたは複数のプログラミング言語の任意の組み合わせで書かれることも可能である。プログラム・コードは、全体的にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンド・アロンのパッケージ・ソフトのように部分的にユーザのコンピュータおよび部分的には遠隔のコンピュータ上で、或いは全体的に遠隔のコンピュータまたはサーバ上で実行され得る。後述するように、遠隔のコンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）または広域ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを介してユーザのコンピュータに接続され得るし、或いは、外部コンピュータへの接続は、（例えば、インターネット・サービス・プロバイダを利用してインターネットを介して）行われ得る。
【００３０】
本発明の実施例におけるコンピュータ・システムのためのソフトウェアは任意の希望のコンピュータ言語で具現化され得るし、本明細書に含まれた機能的説明および図面に示されたフローチャートに基づいて当業者により開発され得るであろう、ということは当然である。ほんの一例として、そのソフトウェアは、C#、C++、Python、Java、またはPHPプログラミング言語において具現化され得る。更に、様々な機能を遂行するソフトウェアに関する本明細書における参照は、一般に、ソフトウェア制御の下でそれらの機能を遂行するコンピュータ・システムまたはプロセッサを指す。
【００３１】
本発明の実施例におけるコンピュータ・システムは、任意のタイプのハードウェアおよび／または他の処理回路によって代替的で具現化され得る。コンピュータ・システムの種々の機能は、任意の量のソフトウェア・モジュールまたはユニット、処理またはコンピュータ・システム、および／または回路の間に任意の態様で分散され得る。なお、コンピュータまたは処理システムは、相互にローカル的にまたは遠隔的に配置され、任意の適切な通信媒体（例えば、ＬＡＮ、ＷＡＮ、イントラネット、インターネット、配線、モデム接続、無線等）を介して通信し得る。
【００３２】
本発明の実施態様は、本発明の実施例に従って方法、装置（システム）およびコンピュータ・プログラムのフローチャートおよび／またはブロック図に関連して説明される。フローチャートおよび／またはブロック図の各ブロック、およびフローチャートおよび／またはブロック図におけるブロックの組み合わせがコンピュータ・プログラム命令によって具現化され得る、ということは明らかであろう。これらのコンピュータ・プログラム命令は、汎用コンピュータ、特殊目的コンピュータ、または他のプログラマブル・データ処理装置のプロセッサに提供されて、コンピュータまたは他のプログラマブル・データ処理装置のプロセッサを通して実行される命令がフローチャートおよび／またはブロック図のブロックにおいて指定された機能／行為を具現化するための手段を形成するようにマシンを創出し得る。
【００３３】
これらのコンピュータ・プログラム命令はコンピュータ可読媒体にも格納され、そのコンピュータ可読媒体に格納された命令が、フローチャートおよび／またはブロック図のブロックで指定された機能／行為を具現化する命令を含む１つの製造物を創出するというような特定の態様で機能するよう、コンピュータ、他のプログマブル・データ処理装置、または他のデバイスに指示し得る。コンピュータ・プログラム命令は、コンピュータ、他のプログマブル・データ処理装置、または他のデバイス上にロードされ、コンピュータ、他のプログマブル・データ処理装置、または他のデバイス上で一連のオペレーション・ステップを遂行させ、コンピュータまたは他のマブル装置上で実行される命令が、フローチャートおよび／またはブロック図のブロックにおいて指定された機能／行為を具現化するためのプロセスを提供するというようなコンピュータ実装プロセスを創出し得る。
【００３４】
プログラム・コードを格納および／または実行するに適したに処理システムは、好ましくは、ディスプレイもしくはモニタ、ベース（例えば、プロセッサ、メモリ、または内部もしくは外部通信装置（例えば、モデム、ネットワーク・カード等）、および光学的入力装置（例えば、キーボード、マウス、または他の入力装置））を備えた、任意の一般的なもしくは他のコンピュータまたは処理システムによって具現化され得る。システムは、システム・バスを介してメモリ素子に直接または間接的に結合された少なくとも１つのプロセッサを含み得る。メモリ素子は、プログラム・コードの実行中に使用されるローカル・メモリ、大容量記憶装置、および、コードが実行中に大容量記憶装置から検索されなければならない回数を減らすために少なくとも幾つかのプログラム・コードの一時的記憶を行うキャッシュ・メモリを含み得る。入出力装置、即ちＩ／Ｏ装置（キーボード、ディスプレイ、ポインティング装置等を含むが、それらに限定されない）は、直接にまたは介在Ｉ／Ｏコントローラを介してシステム結合され得る。ネットワーク・アダプタもシステムに結合され、介在する私設または公衆ネットワークを介してシステムが他の処理システム、遠隔のプリンタ、または記憶装置に結合されることを可能にする。モデム、ケーブル・モデム、およびEthernetカードは、数少ない現在利用可能なタイプのネットワーク・アダプタである。
【００３５】
図面におけるフローチャートおよびブロック図は、本発明の様々な実施例に従って、システム、方法およびコンピュータ・プログラムの可能な実施態様のアーキテクチャ、機能、およびオペレーションを示す。この点に関して、フローチャートまたはブロック図における各ブロックは、指定された論理機能を具現化するための１つまたは複数の実行可能な命令を含むモジュール、セグメント、またはコードの部分を表し得る。或る別の実施態様では、ブロックに記された機能は図に書かれた順序から外れて生じることもあるということに留意されたい。例えば、連続して示された２つのブロックが、実際には、実質的に同時に実行されることがあるし、それらのブロックが、関連する機能に依存して、逆の順序で実行されることもある。更に、ブロック図および／またはフローチャートの各ブロック、並びにブロック図および／またはフローチャートにおけるブロックの組み合わせは、指定された機能もしくは行為、または特殊目的のハードウェアおよびコンピュータ命令の組み合わせを遂行する特殊目的のハードウェア・ベースのシステムによって具現化され得るということにも留意されたい。
【００３６】
本明細書で使用された用語は、特定の実施例のみを説明する目的のものであり、本発明を限定することを意図するものではない。本明細書で使用されたときの「含む」という用語は、開示された特徴、整数、ステップ、オペレーション、要素、および／またはコンポーネントの存在を明示するが、１つまたは複数の特徴、整数、ステップ、オペレーション、要素、コンポーネント、および／またはそれのグループの存在または追加を妨げるものではない。
【図１】
0005602597.tif 000002
【図２】
0005602597.tif 000003
【図３】
0005602597.tif 000004
【図４】
0005602597.tif 000005
【図５】
0005602597.tif 000006
【図６】
0005602597.tif 000007
【図７】
0005602597.tif 000008
【図８】
0005602597.tif 000009
【図９】
0005602597.tif 000010