JNI 経由で Java から呼び出されているネイティブ C DLL によって使用されているメモリを監視するにはどうすればよいですか? 標準の Java 監視ツールとオプションを使用すると、Java メモリ スペースは表示されますが、C DLL が使用するメモリは表示されません。Java は ~70MB を使用していますが、タスク マネージャーのタスクは 200MB 以上を示しています。
4 に答える
パフォーマンス モニターのカウンターでネイティブ ヒープを監視できます。(perfmon32) ただし、jvm.dll がここに含まれていても、DLL ごとに分類することはありません。
世の中にあるほとんどのプロファイリング ツールは、プロセスにアタッチして、メモリの割り当てと割り当て解除をキャプチャして追跡できます。これにより、リークがどこにあるかを推測できます。Java から呼び出されたネイティブ コードのメモリ リークを最近追跡しようとしたときに見つけた非常に優れたものの 1 つは、Memory Validatorです。
これを C DLL 内で行うことでさえ、それほど簡単ではないと思います。
私が理解している限り、標準の Java 監視ツールは仮想マシンにクエリを実行して情報を収集します。そのため、仮想マシンが動的にリンクされたライブラリを検査する方法を知らない限り、そのメモリが同じプロセスにあるとしても、何も見ることができません。 . メモリ使用量を追跡するには、外部ツールを使用するか、DLL に大規模な変更を加える必要があると思います。
DLL は実際には Java ヒープの一部ではないため、最も正確な読み方は、小さなプロファイリング プログラム (小さな Java/JNI プログラムまたは C++/C# など) を作成して、インポートして使用することだと思います。アプリケーションと同様の方法で DLL を作成し、それ以外のことは何も行いません。DLL をそのまま使用してください。このプロファイリング アプリの結果のメモリ プロファイルは、DLL のメモリ プロファイルの適切な近似値になるはずです。
また、DLL の静的または動的なメモリ シェイプがあるかどうかをテストする必要があります。DLL がロードされる直前と直後にメモリ測定を行い、最大 130 MB の 1 回限りのヒットがあるかどうか、またはメモリがゆっくりと増加するかどうかを確認します。時間。
Solaris / Linux では、Sun Studio Collector / Analyzer がこれに適したツールであると聞いたことがありますが、DLL ランド (いわば DLL 地獄) で立ち往生しています。