1

わかりましたので、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 は不連続なアドレス空間を処理できるのに完全にクラッシュしたのでしょうか?

4

1 に答える 1

4

ここでうまくいかない可能性のあることが多すぎて、それがどれであるかを推測することはできません.

ちょっとしたアドバイス:

  • 実際の証拠とは無関係に理論を展開することによって、問題をデバッグしようとするのは悪い考えです。これは、(明らかに)実際の証拠なしに、不連続なアドレス空間に関係しているという理論があります。まずは証拠を集め...

  • 変数をランダムに変更する (別の JVM を試すなど) ことは、それが問題であるという証拠がない限り、悪いアプローチです...あなたの場合。

  • 32 ビット プラットフォームとレガシー オペレーティング システムで実行するものを構築している場合は、日常的な開発テストを行うための 32 ビット + レガシー OS テスト環境が必要です。(あなたの質問の文言は、あなたが持っていないことを示唆しています。)

  • クライアントが見ている実際の問題を再現する必要があります。彼らのプログラムとハードウェアや OS などの詳細を入手し、クローンをセットアップしてみてください。それが不可能な場合は、キットに直接アクセスできるサイト訪問を手配してください.

そして最後に。同じプロセスで C、C#、および Java を組み合わせようとするシステム設計は、技術的に非常に危険です。これが良いアイデアだと判断した人は誰でも、再教育する必要があります。

于 2012-06-28T03:32:36.300 に答える