Как анализировать дамп кучи, используя jmap в java
Я создаю кучу дампа, используя следующую команду:
jmap -dump:file=DumpFile.txt <process-id>
Я открыл сгенерированный файл - DumpFile.txt, но он не в читаемом формате.
Поэтому, пожалуйста, дайте мне знать, как анализировать данные в сгенерированном файле.
Ответы
Ответ 1
Вы должны использовать jmap -heap:format=b <process-id>
без каких-либо путей. Поэтому он создает *.bin файл, который можно открыть с помощью jvisualvm.exe
(тот же путь, что и jmap). Это отличный инструмент для открытия таких файлов дампа.
Ответ 2
Вы можете использовать jhat
(Java Heap Analysis Tool) для чтения сгенерированного файла:
jhat [ options ] <heap-dump-file>
Команда jhat анализирует файл дампа java-кучи и запускает веб-сервер. jhat позволяет вам просматривать кучи кучи, используя ваш любимый веб-браузер.
Обратите внимание, что вы должны иметь выходной файл двоичного формата hprof
, чтобы он мог анализировать его с помощью jhat
. Вы можете использовать опцию format=b
для создания дампа в этом формате.
-dump:format=b,file=<filename>
Ответ 3
Если вы используете Eclipse в качестве своей IDE, я бы рекомендовал отличный плагин eclipse анализатор памяти
Другой вариант - использовать JVisualVM, он может читать (и создавать) кучи кучи, а также поставляется с каждым JDK. Вы можете найти его в каталоге bin вашего JDK.
Ответ 4
VisualVm не поставляется с Apple JDK. Вы можете использовать пакет приложений VisualVM для Mac (dmg) в качестве отдельного приложения, чтобы компенсировать это.
Ответ 5
Очень поздно ответить на это, но стоит взглянуть быстро. Всего 2 минуты нужно было понять подробно.
Сначала создайте эту java-программу
import java.util.ArrayList;
import java.util.List;
public class GarbageCollectionAnalysisExample{
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
for (int i = 0; i < 100000000; i++) {
l = new ArrayList<String>(); //Memory leak
System.out.println(l);
}
System.out.println("Done");
}
}
Используйте jps, чтобы найти vmid (идентификатор виртуальной машины, то есть JVM id)
Перейдите в CMD и введите команды ниже >
C:\>jps
18588 Jps
17252 GarbageCollectionAnalysisExample
16048
2084 Main
17252 - это vmid, который нам нужен.
Теперь мы узнаем, как использовать jmap и jhat
Использовать jmap - для создания дампа кучи
Из java-документов о jmap
"jmap печатает карты памяти общих объектов или детали памяти кучи данного процесса или файла ядра или удаленного сервера отладки"
Используйте следующую команду для генерации дампа кучи >
C:\>jmap -dump:file=E:\heapDump.jmap 17252
Dumping heap to E:\heapDump.jmap ...
Heap dump file created
Где 17252 - vmid (выбранный сверху).
Дамп кучи будет сгенерирован в E:\heapDump.jmap
Теперь используйте Jhat
Jhat используется для анализа дампа коллекции мусора в java -
C:\>jhat E:\heapDump.jmap
Reading from E:\heapDump.jmap...
Dump file created Mon Nov 07 23:59:19 IST 2016
Snapshot read, resolving...
Resolving 241865 objects...
Chasing references, expect 48 dots................................................
Eliminating duplicate references................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
По умолчанию он запустит http-сервер на порте 7000.
Затем мы перейдем к http://localhost:7000/
Предоставлено: JMAP, Как отслеживать и анализировать мусор коллекции в 10 направлениях
Ответ 6
MAT, jprofiler, jhat - возможные варианты. поскольку jhat поставляется с jdk, вы можете легко запустить его, чтобы сделать некоторый базовый анализ. проверьте это