Здоровье Java Heap дамп памяти

При решении вопроса о стресс-тестов, часто встречающаяся ситуация ООМ, на этот раз нам нужно записывать в режиме реального времени ситуацию памяти, как правило, играют файл дампа, а затем использовать MAT и другой анализ памяти инструмент, чтобы увидеть, какие объекты были занимают много памяти , в конечном счете, местный код требует оптимизации.

Так как Java файл дампа, чтобы играть?

Java предоставляет jmap команды следующим образом:

jmap -dump: Формат = Ь, файл = / путь / heap.bin进程ID
jmap -dump: живой, формат = Ь, файл = / путь / heap.bin进程ID
живой参数:

Значит, что нам нужно, чтобы захватить текущие объекты памяти в жизненном цикле, что означает, что GC объекты, близкие не идут, то наши в большинстве случаев, вы должны видеть, что эти памяти. И это уменьшит размер файла дампа.

Может быть запущена непосредственно из командной строки, конечно, также может быть выполнена с использованием Java, как указано, например:

пакет com.szh;

импорт java.io.BufferedReader;
импорт java.io.File;
импорт java.io.IOException;
импорт java.io.InputStreamReader;
импорт java.text.SimpleDateFormat;
импорт java.util.Date;
импорт java.util.Scanner;
импорт java.util.concurrent.TimeUnit;

общественного класса TestDump {
государственной статической силы основных (String [] арг) бросает InterruptedException, IOException {
SimpleDateFormat SDF = новый SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss");
Продолжительность выполнения = Runtime.getRuntime ();

Сканер = новый сканер (System.in);
System.out.println ( "请输入ява进程PID:");
INT = Pid scanner.nextInt ();
System.out.println ( "请输入свалка文件输出路径:");
Строка dumpPath = scanner.next ();
scanner.close ();

если (dumpPath.endsWith (File.separator)!) {
dumpPath = dumpPath + File.separator;
}
Строка CMD = "jmap -dump, формат = Ь, файл =" + dumpPath + "_" + sdf.format (новая дата ()) + ".bin" + Pid;
Runtime.exec (CMD);
TimeUnit.SECONDS.sleep (5 л);

в то время (правда) {
CMD = "jmap -dump: живой, формат = Ь, файл =" + dumpPath + "_" + sdf.format (новая дата ()) + ".bin" + Pid;
Процесс Процесс = Runtime.exec (CMD);
/ * InputStreamReader ISR = новый InputStreamReader (process.getInputStream (), "GBK");
BufferedReader ш = новый BufferedReader (ISR);
в то время как (истинно) {
Строка ул = br.readLine ();


}
System.out.println (STR);
} * /
TimeUnit.HOURS.sleep (1L);
}
}
}
 
----------------
Описание ссылка: https: // блог. csdn.net/songzehao/article/details/84575834

 

рекомендация

отwww.cnblogs.com/xd502djj/p/12176568.html