わかりましたので、CラッパーDLLを呼び出すC#ドライバー(デバイスドライバーではなくスタブを呼び出すダミープログラムのようなドライバー)プログラムを作成しました。CラッパーDLLは、実際にほとんどの作業を行うJNIを介してJava jarファイルを呼び出します。3 つのプログラムはすべて 32 ビットです。これは、C# および C DLL を呼び出す C プログラムを実行することになっている別のベンダーと統合するために行われます。
私のサンプル テスト C# to C to Java プログラムは正常に動作しますが、問題は、ベンダーの実際の C# プログラムが私たちのプログラムを呼び出すときに、Hotspot JVM が完全に初期化に失敗するか、関数の呼び出し中に適切に初期化された場合にスローされることです。 OutOfMemory エラー。連続したヒープ領域を必要としない JRockit JVM を使用しようとしたところ、JVM が原因でプログラムが完全にクラッシュしました。
開発プラットフォームは Windows 7 64 ビット OS です。Core i7、8GB RAM 実際のプログラムは、古いハードウェア/OS との下位互換性のために 32 ビットである必要があります。
私の理解では、32 ビット プロセスは通常、最大 2 GB のアドレス空間を利用できます。ドライバー プログラムが使用するタスク マネージャーから取得した最大合計サイズは 256 MB です。ベンダーの C# プログラムは他のライブラリをかなり多くロードしますが、それらが 700MB 以上を占めるとは思えません。
ここで何が問題になる可能性がありますか? アドレス空間が連続していないということですか?しかし、もしそうなら、なぜ JRockit は不連続なアドレス空間を処理できるのに完全にクラッシュしたのでしょうか?