0

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 で動作する必要があります。

4

2 に答える 2

1

個人的にはjProfilerの機能がわからないので、最初にEclipseMATを使用することをお勧めします。次に、ヒープダンプをロードするときに、int[]の着信参照の一部を確認できます。配列を作成したピンポイントを細くして、どの保持クラスが実際に大量に作成しているかを確認できます。

于 2011-01-07T21:16:34.813 に答える
1

Retained Heap でオブジェクトをソートする必要があります。すべての int[] を含む意味のあるオブジェクト/クラスがすぐに見つかります。

于 2011-01-07T21:07:59.147 に答える