質問

JavaからJNI経由で呼び出されるネイティブC DLLが使用しているメモリを監視するにはどうすればよいですか?標準のJava監視ツールとオプションを使用すると、Javaのメモリスペースは表示されますが、C DLLが使用するメモリは表示できません。 Javaは〜70MBを使用していますが、タスクマネージャーのタスクには200Mb +が表示されます。可能であれば、130MBの余分な容量を確認したいのです。

役に立ちましたか?

解決

パフォーマンスモニターのカウンターを使用して、ネイティブヒープを監視できます。 (perfmon32)ただし、DLLごとに分類されることはありません。jvm.dllもここに含まれます。

ほとんどのプロファイリングツールは、プロセスにアタッチし、メモリ割り当てと割り当て解除をキャプチャおよび追跡できます。これにより、リークの場所を推測できます。 Javaから呼び出されたネイティブコードのメモリリークを最近追跡しようとしたときに見つけた非常に良いものは、メモリ検証

他のヒント

プロセスビューアーを使用して、さらに掘り下げました。

DLLのソースがある場合は、デバッグライブラリと場合によってはメモリ割り当てトラッカーを使用して再構築できます。また、ビジュアルC ++デバッガーを使用してデバッグできます(Javaアプリケーションを使用するように指示する必要があります)。

ソースを取得していない場合-オプションは制限されています。

C DLL内でこれを行うことも非常に簡単ではないと思います。

標準のJava監視ツールが仮想マシンを照会して情報を収集することを理解している限り、仮想マシンが動的にリンクされたライブラリを検査する方法を知らない限り、そのメモリは同じプロセス内にありますが、何でも見ることができます。メモリ使用量を追跡するには、外部ツールを使用するか、DLLに多少の大幅な変更を加える必要があると思います。

まあ、DLLは実際にはJavaヒープの一部ではないので、最も正確な読み取りは、インポートする小さなプロファイリングプログラム(小さなJava / JNIプログラムまたはC ++ / C#など)を書くことだと思いますアプリケーションと同様の方法でDLLを使用し、その他は何もしません-DLLをそのまま使用します-このプロファイリングアプリの結果のメモリプロファイルは、DLLのメモリプロファイルの近似値になるはずです。

また、DLLの static または dynamic のメモリ形状があるかどうかをテストする必要があります-DLLがロードされる直前と直後にメモリ測定を行い、存在するかどうかを確認します1回限りの最大130MBのヒット、またはメモリが時間の経過とともにゆっくりと上昇する場合。

Solaris / Linuxでは、Sun Studio Collector / Analyzerがこれに適したツールであると聞いたことがありますが、DLLランド(またはDLLの地獄)で立ち往生しています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top