Bagaimana cara menganalisis file .hprof?

227

Saya memiliki server produksi yang berjalan dengan bendera berikut: - XX: + HeapDumpOnOutOfMemoryError

Tadi malam ia menghasilkan file java-38942.hprof ketika server kami mengalami kesalahan tumpukan. Ternyata para pengembang sistem tahu tentang bendera itu tetapi tidak ada cara untuk mendapatkan informasi yang berguna darinya.

Ada ide?

Nick Stinemates
sumber

Jawaban:

215

Jika Anda ingin alat yang cukup canggih untuk melakukan pencilikan serius, lihat proyek Memory Analyzer di Eclipse, yang disumbangkan kepada mereka oleh SAP.

Beberapa hal yang dapat Anda lakukan sangat baik untuk menemukan kebocoran memori, dll - termasuk menjalankan bentuk SQL terbatas (OQL) terhadap objek dalam memori, yaitu

SELECT toString (firstName) FROM com.yourcompany.somepackage.User

Sangat brilian.

Cowan
sumber
18
Saya hanya ingin menambahkan +100 untuk Eclipse Memory Analyzer. Saat ini saya sedang mencoba untuk menyaring file dump setinggi 400mb +, dan butuh lebih dari 70 menit untuk membaca file, sebelum menyebabkan crash JVM lengkap. EMA dapat membukanya dalam <5 menit.
matt b
3
Saya terus mendapatkan kesalahan penguraian saat membuka file HPROF menggunakan Eclipse Memory Analyzer (yang sebenarnya juga dibuang oleh Eclipse!). Sial .. menghela nafas.
lost_bits1110
3
MAT masih dapat membutuhkan sedikit RAM [kurang dari JHAT tetapi masih sedikit]. Lihat stackoverflow.com/questions/7254017/... untuk tips jika Anda mengalami hal itu.
rogerdpack
71

Anda dapat menggunakan JHAT , Alat Analisis Java Heap yang disediakan secara default dengan JDK. Ini adalah baris perintah tetapi memulai server web / browser yang Anda gunakan untuk memeriksa memori. Bukan yang paling ramah pengguna, tetapi setidaknya itu sudah diinstal sebagian besar tempat Anda akan pergi. Tampilan yang sangat berguna adalah tautan "heap histogram" di bagian paling bawah.

ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat dapat menjalankan OQL "hari ini" juga (tautan bawah "jalankan OQL")

CMS
sumber
Setelah menjalankan perintah di atas Di konsol Anda akan mendapatkan pesan di terminal "server siap" Port: 7401. Setelah itu buka URL ini: localhost: 7401 "Anda dapat melihat detail di jendela browser".
Laxman G
35

Anda juga dapat menggunakan HeapWalker dari Netbeans Profiler atau alat yang berdiri sendiri Visual VM . Visual VM adalah alternatif yang baik untuk JHAT karena itu berdiri sendiri, tetapi jauh lebih mudah digunakan daripada JHAT.

Anda memerlukan Java 6+ untuk sepenuhnya menggunakan Visual VM.

James Schek
sumber
Anda harus menambahkan catatan bahwa ini hanya untuk Java 6 dan 7.
Nick Stinemates
AFAIK, HeapWalker dan VisualVM tidak memerlukan Java 6/7 untuk membaca file HPROF.
James Schek
Saya baru saja mencoba memuatnya dengan Java 5 dan berbunyi 'Tolong gunakan Java 6 atau 7' Apa yang saya lakukan salah?
Nick Stinemates
Hmm. Mungkin Anda harus menjalankan Java 6, tetapi dapat membaca JavaROF 5 Java (mungkin itulah cara saya membuatnya berfungsi). Saya tahu Anda tidak dapat membuat heap-dump dari Visual VM pada aplikasi yang menjalankan Java 5. Akan memperbarui.
James Schek
Anda juga dapat menggunakan JVM visual, dari java SDK - cari jvisualvm.exedi JAVASDK/binfolder
xxxvodnikxxx
11

Dapatkan saja Eclipse Memory Analyzer . Tidak ada yang lebih baik di luar sana dan gratis.

JHAT hanya dapat digunakan untuk "aplikasi mainan"

Kohlerm
sumber
3
JHAT diperlukan untuk mengesankan peretas "l33t" yang membangun distro BSD yang dimulai dengan LILO. Tunggu ... mereka tidak akan pernah menggunakan java. :-)
James Schek
Saya pikir ini lebih dari komentar ...: \
rogerdpack
10

YourKit Java Profiler tampaknya juga menangani mereka.

Polaris
sumber
5

Jika Anda ingin melakukan analisis kustom heapdump Anda, maka ada:

Pustaka ini cepat tetapi Anda harus menulis kode analisis di Jawa.

Dari dokumen:

  • Tidak membuat file sementara pada disk untuk memproses dump heap
  • Dapat bekerja secara langsung GZ dump heap terkompresi
  • Notasi HeapPath
Andrejs
sumber
2

Saya pribadi lebih suka VisualVM. Salah satu fitur yang saya suka di VisualVM adalah perbandingan heap dump. Ketika Anda melakukan heap dump analysis ada berbagai cara untuk mencari tahu apa yang menyebabkan crash. Salah satu cara yang menurut saya bermanfaat adalah melakukan perbandingan timbunan timbunan yang sehat dan tidak sehat.

Berikut ini adalah langkah-langkah yang dapat Anda ikuti untuk itu:

  1. Mendapatkan tumpukan heap dari OutOfMemoryError, sebut saja "oome.hprof". Anda bisa mendapatkan ini melalui parameter JVM HeapDumpOnOutOfMemoryError.
  2. Restart aplikasi, biarkan berjalan besar (menit / jam) tergantung pada aplikasi Anda. Dapatkan tumpukan heap lainnya saat aplikasi masih berjalan. Sebut saja "health.hprof".
  3. Anda dapat membuka kedua kesedihan ini di VisualVM dan melakukan perbandingan tumpukan tumpukan. Anda dapat melakukannya di tingkat kelas atau paket. Ini sering dapat mengarahkan Anda ke arah masalah.

tautan: https://visualvm.github.io

Waleed
sumber