Як я аналізую файл .hprof?


227

У мене на виробничому сервері працює такий прапор: - XX: + HeapDumpOnOutOfMemoryError

Минулої ночі він створив файл java-38942.hprof, коли наш сервер зіткнувся з помилкою купи. Виявляється, розробники системи знали прапор, але жодного способу отримати з нього корисну інформацію.

Будь-які ідеї?

Відповіді:


215

Якщо ви хочете досить вдосконалити інструмент для серйозного повороту, подивіться на проект аналізатора пам’яті на Eclipse, який сприяв їм SAP.

Дещо з того, що ви можете зробити, є надзвичайно гарним для пошуку витоків пам’яті тощо - включаючи запуск форми з обмеженим SQL (OQL) проти об'єктів в пам'яті, тобто

SELECT toString (firstName) ВІД com.yourcompany.somepackage.User

Цілком блискуче.


18
Я просто хотів би додати +100 для аналізатора пам'яті Eclipse. Наразі я намагаюся просіяти через дамб-файл на 400 Мб +, і для того, щоб прочитати файл, знадобилося більше 70 хвилин, перш ніж він спричинив повний збій JVM. EMA може відкрити його за <5 хвилин.
matt b

3
Я постійно отримую помилки розбору при відкритті файлів HPROF за допомогою аналізатора пам'яті Eclipse (які насправді також скидаються програмою Eclipse!). Нещасний .. зітхнути.
lost_bits1110

3
MAT все ще може вимагати зовсім небагато оперативної пам’яті [менше, ніж JHAT, але все-таки зовсім небагато]. Дивіться stackoverflow.com/questions/7254017/… для порад, якщо ви натрапите на те, що відбувається.
rogerdpack

71

Ви можете використовувати JHAT - інструмент аналізу вершин Java Heap, наданий за замовчуванням у JDK. Це командний рядок, але запускає веб-сервер / браузер, який ви використовуєте для дослідження пам'яті. Не найзручніший користувач, але принаймні в ньому вже встановлено більшість місць, куди ви поїдете. Дуже корисним виглядом є посилання "куча гістограми" в самому дні.

колишній: jhat -port 7401 -J-Xmx4G dump.hprof

jhat може також виконати OQL "у ці дні" (нижнє посилання "виконати OQL")


Після запуску вище команди У консолі ви отримаєте повідомлення в терміналі "сервер готовий" Порт: 7401. Після цього відкрийте цю URL-адресу: localhost: 7401 "Ви можете побачити деталі у вікнах браузера".
Laxman G

35

Ви також можете використовувати HeapWalker від Netbeans Profiler або автономний інструмент Visual VM . Visual VM - хороша альтернатива JHAT, оскільки він є окремим, але набагато простіше у використанні, ніж JHAT.

Для повного використання Visual VM вам потрібна Java 6+.


Вам слід додати зауваження, що це стосується лише Java 6 та 7.
Нік Stinemates

AFAIK, HeapWalker і VisualVM не вимагають Java 6/7 для читання файлів HPROF.
Джеймс Шек

Я просто спробував завантажити його на Java 5, і він сказав "Будь ласка, використовуйте Java 6 або 7" Що я роблю неправильно?
Нік Stinemates

Хм. Можливо, вам доведеться запустити Java 6, але ви можете прочитати Java 5 HPROF (можливо, саме так я змусив її працювати). Я знаю, що ви не можете створити накопичувач із Visual VM у додатку під управлінням Java 5. Оновиться.
Джеймс Шек

Ви також можете використовувати візуальний JVM, з Java SDK - шукай jvisualvm.exeв JAVASDK/binпапці
xxxvodnikxxx

11

Просто дістаньте аналізатор пам'яті Eclipse . Там немає нічого кращого, і це безкоштовно.

JHAT можна використовувати лише для іграшкових додатків


3
JHAT необхідний для враження тих хакерів "l33t", які вручну створюють дистрибутив BSD, починаючи з LILO. Зачекайте ... вони ніколи б не використовували Java. :-)
Джеймс Шек

Я думаю, що це більше коментар ...: \
rogerdpack

10

Зрозуміло, що ваш Profiler JavaKit також справляється з ними.


5

Якщо ви хочете зробити власний аналіз свого heapdump, тоді є:

Ця бібліотека швидка, але вам потрібно буде написати свій код аналізу на Java.

З документів:

  • Не створює на диску жодних тимчасових файлів для обробки накопичувального дампа
  • Може працювати безпосередньо звалищеними відвалами ГЗ
  • Позначення на HeapPath

2

Я особисто віддаю перевагу VisualVM. Однією з особливостей, які мені подобаються у VisualVM, є порівняння купи дампа. Коли ви робите аналіз звалищних кущів, існують різні способи з'ясувати, що спричинило збій. Одним із способів, який я вважаю корисним, є порівняння здорових та нездорових відвалів.

Нижче наведено кроки, які ви можете виконати для цього:

  1. Отримання купольного дампа OutOfMemoryError давайте назвемо його "oome.hprof". Ви можете отримати це за допомогою параметра JVM HeapDumpOnOutOfMemoryError.
  2. Перезапустіть програму, нехай вона працює протягом великих хвилин (годин / годин) залежно від вашої програми. Отримайте ще один відвал купи, поки програма все ще працює. Назвемо це "здоровим.hprof".
  3. Ви можете відкрити обидва ці дампи у VisualVM та зробити порівняння з накопиченням. Це можна зробити на рівні класу або пакету. Це часто може вказувати вам на напрямок проблеми.

посилання: https://visualvm.github.io

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.