JDKツールを使用して、システムのメモリ漏洩がないかどうかを確認します.

2636 ワード

数ヶ月前、ボスは私たちにjmapとjhatを使ってシステムにメモリ漏れがあるかどうかを検査する方法を訓練してくれました.この2、3日、突然自分で実験してから記録すべきだと思い出しました.
まず実験の前に、jdkが持っているツールをいくつか紹介します.
1.jps Unixのpsコマンドと同様にjavaプロセスのpidをすべて表示するコマンド
2.jmapがjavaプロセス(pidを使用)メモリ内のすべての「オブジェクト」を印刷する場合
3.jhatは主にjmapによって生成されたdumpを分析し、webページを提供して分析結果を表示する.
4.jconsoleは、スタックメモリ、スレッド、クラス、CPUの状況を表示できます.
実験のために、メモリの漏洩があるコードを先に書かなければなりません.コードは以下の通りです.

/**
*
* @author crane.ding
*/
public class MemoryLeakDemo {

static List cache = new ArrayList();

public static void main(String[] args) throws InterruptedException {
Thread.currentThread().setName("Memory Leak Thread");

do {
cache.add(new int[1024 * 50]);// 50Kb

Thread.sleep(500);
} while(true);
}

}

まずMemoryLeakDemoを実行し、次にコンソールを実行し、jconsoleコマンドを使用して実行状況を観察します.

# jconsole

[b]図1[/b]
[img]http://dl.iteye.com/upload/attachment/279543/43f17832-04fe-33a9-a820-8a4d4e09ccdd.jpg[/img]
図1に示すように、メモリが常に上昇していることがわかります.「gcを実行」ボタンをクリックすると、効果が明らかではありませんか、それとも上昇し続けているのか、ここから小さな問題がわかります.これは、jmapを使用してメモリオブジェクトを印刷したり、jhatを使用してメモリとクエリーメモリを表示したりできる場合です.

# jps
3704 MemoryLeakDemo
3280
3768 Jps
# jmap -dump:format=b,file=heap.bin 3704
Dumping heap to D:\Program Files\Cygwin\home\crane.ding\heap.bin ...
Heap dump file created
# jhat heap.bin
Reading from heap.bin...
Dump file created Sun Jul 18 13:36:46 CST 2010
Snapshot read, resolving...
Resolving 3985 objects...
Chasing references, expect 0 dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

jhatはHTTPサーバのローカル7000ポートを起動しているので、ブラウザでページを開くことができます(http://127.0.0.1:7000/解析解釈で問題を見つけるのに時間がかかるかもしれませんcom.craneding.MemoryLeakDemoクラスにはcacheという変数のArrayListがあり、int配列が大量に保存されています.コードを結合しています.オブジェクトを操作するコードを検索し、コードの問題を発見します.これは簡単な実験です.今回の実験を経て、jhatが示した分析結果はまだ直感的ではないことに気づきました.その後、eclipseがjmapの結果を表示するプラグインMemory Analyzer(http://download.eclipse.org/mat/1.0/update-site/)、インストール後、eclispeは直接heap.binファイルを次の図に開くことができます.
[img]http://dl.iteye.com/upload/attachment/279553/9a2a5d7a-386b-3e85-9551-53dd8286333b.jpg[/img]
「Problem Suspect 1」の「Detail」をクリックして詳細を見ると、この時点でオブジェクトの様子が直感的に見えます.以下の図です.
[img]http://dl.iteye.com/upload/attachment/279556/1818ffbd-95af-3001-833f-ad3ab021fe67.jpg[/img]
ArrayList内のオブジェクトやオブジェクトのメモリサイズなどを明確に表示し、コードを組み合わせて問題を検索すると、すぐに問題が見つかります.
条件が許容される条件では、Memory Analyzerを使用してjmapの解析結果を解析すると直感的になります.