2011-07-28 23 views
7

私のJavaコードでネイティブのメモリリークが疑われています。ネイティブメモリプロファイリングを行うツールはありますか?また、実行中のJavaプロセスのネイティブ・メモリー分析をサポートするツールはありますか?ネイティブメモリリーク解析のツール

ありがとうございます!

編集: 私はすでにMemory ValidatorとPurifyを試しましたが、32ビットプロセスのみをサポートしているようです。上記のものに似たいくつかのツールがあります。これらのツールは、実行中のWindowsプロセスに単純にアタッチして、その特定のプロセスのネイティブメモリ解析を行います。

答えて

-6

私はJProfilerの大ファンです。プロファイリングとメモリリークに最適なツールです。ほとんどのツールに比べてかなり安く、本当に簡単に学べますし、多くの機能があります。

http://www.ej-technologies.com/products/jprofiler/overview.html

+1

JProfilerをもオブジェクトの作成の追跡を可能にする優れたプロファイラです。しかし、ネイティブヒープ割り当てには関係しません。 – eckes

2

は、私の知る限りあなたはなどJProfilerを、JVisualVMなどのJavaツールでそれを行うことはできませんあなたはネイティブコードをネイティブコード使用ツールでメモリリークを持っている場合。あなた。 Cから実行できます(つまり、jvm.dllをロードしています)。この記事を見ることができますfinding memory leaks using Visual StudioまたはMemory Leak Detection in C++ (Linux)

注:もちろん、リークがヒープリーク(delete globalrefを忘れてしまった)に接続されていると、Javaツールで見つけることができますが、JNIでは非常にまれです。

4

Troubleshooting guide for Java SE 6 with Hotspot VMには、ネイティブメモリリークの検出を支援する技術に関するかなり精巧なセクションが含まれています。これらを含める:すべてのメモリの割り当てと解放を包む

  • は、メモリの使用量を追跡するために呼び出します。
  • Microsoft Visual C++コンパイラによって提供されるデバッグサポートや、Linuxでのメモリ割り当てをデバッグするためのmtrace(およびMALLOC_TRACE)など、プラットフォーム固有のサポートに依存します。
  • Rational Purifyのようなメモリリーク解析ツールを使用します。

他のもの。特に、この記事では、すべてのプラットフォームに理想的なソリューションは存在しないと述べています。

また、ほとんどのJVMで使用できるように見える-Xcheck:jniフラグを使用することを検討してください。 -Xフラグ自体は、フラグが非標準であることを示しますが、フラグはIBM JDK,Oracle JRockit R28、さらにはOracle/Sun JVMでも使用可能であるように見えます。フラグを有効にすると、JNI呼び出しの周りにラッパーが追加され、JNI programmers' guide and specificationに記載されているように、JVM呼び出しに渡される不正な引数を追跡できます。一方、メモリリークを検出するのは主観的ですが、無効なパラメータが発行されたためにリークが発生していると思われる場合は、間違いなく役立ちます。

1

私は「MySafe」(https://github.com/serkan-ozal/mysafe)という名前のオープンソースプロジェクトに取り組んでいます。「安全でない」呼び出しを基本的に傍受して監視しています。 (実際、それ以上のものを作ります)。バージョン2.0では、「安全でない」ベースのネイティブメモリリークの追跡と検出に役立ちます。

デモコード:リークのhttps://github.com/serkan-ozal/mysafe/blob/master/src/test/java/tr/com/serkanozal/mysafe/NativeMemoryLeakHuntingDemo.java

示す図源:https://github.com/serkan-ozal/mysafe/blob/master/src/test/resources/native-memory-leak-hunting.png