Как я могу сказать, что использует память, когда переполнение кучи в Java? - PullRequest
1 голос
/ 01 января 2011

Я немного знаю о профилировании, но что меня особенно заинтересовало, так это то, что у меня есть вся память, когда я получаю эти исключения из-за кучи по потоку.

Я начну получать их после часа отладки. Я надеюсь, что есть какой-то дамп или что-то подобное, что я могу использовать, чтобы получить список того, что происходит во время запуска программы.

Кстати, извините, если это ленивый вопрос. Я действительно должен уделить время изучению профилирования.

Grae

Ответы [ 5 ]

4 голосов
/ 01 января 2011

Вы можете использовать jmap -dump для создания дампов кучи. И вы можете анализировать дампы кучи с помощью различных программ, таких как jhat или VisualVM (обе из которых поставляются с JDK).

Там, в Google, есть еще много вещей для вас. : -)

1 голос
/ 01 января 2011

Одним из наиболее полезных инструментов в Sun Java 6 JDK является «jvisualvm», который может подключаться к ранее запущенному процессу и выполнять профилирование памяти, необходимое для решения этой проблемы.

(Вы также можете загрузить VisualVM вручную, но JDK, вероятно, самый простой способ начать работу).

См. http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/applications_local.html для начальных примечаний использования.

1 голос
/ 01 января 2011

Установите JRockit VM и затем используйте командный центр JRockit :) Это действительно очень хорошо, и дает список имен методов и процессорного времени, которое занимают эти методы, а также какие объекты перемещаются вокругв системе.

alt text

1 голос
/ 01 января 2011

Обратите внимание, что тип OutOfMemoryError важен. Есть много вариантов этого. Прочитайте сообщение, которое приходит с исключением. Это может быть «пространство кучи Java», которое указывает на ошибку, связанную с кучей, но может также иметь другое сообщение, относящееся к другим областям памяти (см., Например, этот пост ).

Предполагая, что существует проблема с выделением кучи, вы можете использовать флаг JVM XX: + HeapDumpOnOutOfMemoryError для получения полного дампа кучи при возникновении ошибки. Затем вы можете использовать программу чтения дампов кучи и проанализировать результаты (например, VisualVM или jhat ).

Как уже упоминалось в другом ответе, вы также можете использовать инструмент командной строки jmap. Я бы начал с jmap -histo, который создает простую гистограмму разных классов. Если вы видите класс с необоснованным количеством экземпляров, у вас есть подозрение на утечку памяти.

0 голосов
/ 01 января 2011

VisualVM бесплатен и полезен. JProfiler и YourKit не являются бесплатными и более полезными.

...