jmap -histo
実行中のプロセスでコマンドを 30 分ごとに使用すると、(デスクトップ アプリで) 明らかにメモリ リークである 1 種類のオブジェクトが見つかりました。
リークの原因となっているオブジェクト (つまり、時間の経過とともにインスタンス数が膨大に増加する唯一の種類のオブジェクト) はint[]です。
私BufferedImage
は犯人であると思われますが、それについてはわかりません(sのフラッシュ/無効化には細心の注意を払ってBufferedImage
いましたが、それでもリークが発生していると思います)。
ただし、プログラムの別の部分でも int[] を使用しており、リークがどこから来ているのかわかりません。の出力jmap -histo
は、私の好みには少し「薄い」です。
リークが発生している場所を特定するにはどうすればよいですかint[]
。
ところで、シンプルjmap -histo
がいかに優れているかを指摘したいと思います。多くのオブジェクトでは、インスタンスの数と使用されているメモリの数を確認するだけで、それ以上の分析を必要とせずにリークを特定するのに十分であると確信しています。
ただし、私の場合、何か他のものが必要です。
私の質問は、どのようなツールでリークを発見できるかということではありません。私の質問は:
私のアプリ (または私のアプリが使用している API) がint[]をリークしていることがわかった場合、うまくいけば、リークを見つけるために (たとえば、お気に入りのプロファイラーを使用して) どのような手順を実行できますか?
このツールは、Java 1.5 OS X 10.4 Apple JVM で動作する必要があります。