JConsole
メモリリークを検出するために使用する方法を調べています。
私の中Memory Pool
で私は自分のためにMBeans
定義できることがわかります。
したがって、アプリケーションがこのしきい値を超えると、[メモリ]タブでヒープメモリが赤になります。 UsageThreashold
Tenured Generation
質問:これはどのように役立ちますか?つまり、この設定を使用してメモリを分析するにはどうすればよいですか?この値をどのように把握する必要がありますか?
JConsole
メモリリークを検出するために使用する方法を調べています。
私の中Memory Pool
で私は自分のためにMBeans
定義できることがわかります。
したがって、アプリケーションがこのしきい値を超えると、[メモリ]タブでヒープメモリが赤になります。 UsageThreashold
Tenured Generation
質問:これはどのように役立ちますか?つまり、この設定を使用してメモリを分析するにはどうすればよいですか?この値をどのように把握する必要がありますか?
私の意見では、パラメータがメモリリークを検出するのに最も役立つとは思いませんUsageThreashold
(ただし、誰かがそれに関するトリックを知っている場合は、共有してください)。私の経験では、そのパラメーターは、アプリケーションが最大ヒープサイズに近づきすぎて、を取得する危険があるかどうかを視覚的に理解するのに役立ちますOutOfMemoryException
。
まだJConsole
メモリリークの検索に使用することに関しては、このプロセスに特効薬はないと思います。しかし、私が通常行うことは次のとおりです。
メモリリークが存在する場合、それはオブジェクト(リークしているオブジェクト)が収集されないことを意味します。したがって、Tenured Generation
GCをいくら行っても完全には回復しません。
アプリケーションが実行されている状態で、接続JConsole
し、メモリタブを観察してリークを見つけようとします。アプリケーションを数回計算した後、さまざまなGCが発生した後(Perform GC
ボタンを押すとgcがいっぱいになるなど)、メモリが下がることはありません。 、または少なくともメモリ値までは、何かがリークしている可能性が高いことを追跡し始めました。リークが大きい場合は、メモリに「階段グラフ」パターンを表示することもできます。
アプリケーションで長時間の計算が実行されている場合は、メモリを消費する可能性があるため、この分析は慎重に行う必要があることに注意してください。これらのプロセスがいつ終了したかを理解する必要があります。たとえば、これらの計算の1つを実行し、メモリの全体的な進化を、前、最中、および後に追跡します。
また、代わりにvisualVMを試してみることをお勧めします。これにより、ヒープダンプを作成することもできます。これを使用して、メモリ内に残っているオブジェクトを理解し、参照グラフを調べて、それらが収集されない理由を理解することができます。
JMAPを使用して、ヒストグラムを表示したり、ヒープダンプを作成したり、EclipseMATやYourKitなどのツールを使用してメモリ消費量を調べたりすることができます。JConsoleは、MBeanの監視と実行に多く使用され、分析にはあまり使用されません。JVisualvmは、コードのサンプリングに使用でき、CPUを消費しているメソッドを確認できるため、JVisualvmの方が適しています。