Heap Dump dan Analisis dengan VisualVM

Dalam posting blog sebelumnya, saya telah membahas penggunaan VisualVM untuk memperoleh informasi runtime JVM HotSpot dengan cara yang mirip dengan jinfo dan cara menggunakan VisualVM dalam hubungannya dengan JMX dan MBeans dengan cara yang mirip dengan JConsole. Posting blog ini membahas bagaimana VisualVM dapat digunakan untuk menghasilkan dan menganalisis heap dump dengan cara yang mirip dengan yang dilakukan dengan alat baris perintah jmap dan jhat.

Alat jmap (Java Memory Map) adalah salah satu dari beberapa cara pembuatan heap dump Java. TechNotes / halaman manual Alat Analisis Heap Java (jhat) mencantumkan empat metode untuk menghasilkan heap dump yang dapat dianalisis oleh jhat. Empat metode yang terdaftar untuk menghasilkan heap dump adalah penggunaan jmap, JConsole (Java Monitoring and Management Console), HPROF, dan saat OutOfMemoryError terjadi saat -XX:+HeapDumpOnOutOfMemoryErroropsi VM telah ditentukan. Pendekatan kelima yang tidak terdaftar, tetapi mudah digunakan, adalah Java VisualVM. (Omong-omong, metode lain adalah penggunaan MXBean yang disebut HotSpotDiagnosticMXBean dan metode dumpHeap (String, Boolean).)

The jmapalat ini mudah digunakan dari baris perintah untuk menghasilkan tumpukan sampah. Ini dapat digunakan terhadap proses Java yang sedang berjalan yang piocess ID (pid) dikenal (tersedia melalui jps) atau terhadap file inti. Dalam posting ini, saya akan fokus menggunakan jmapID proses yang sedang berjalan.

Halaman jmap menyatakan bahwa jmapmerupakan alat eksperimental dengan kemampuan yang relatif terbatas pada Windows yang mungkin tidak tersedia dengan versi JDK yang akan datang. Halaman ini juga mencantumkan opsi yang tersedia untuk menentukan cara jmapmembuat heap dump.

Cuplikan layar berikut menunjukkan cara jmapdigunakan untuk membuang heap.

File dump yang dihasilkan, dustin.bindalam hal ini, adalah biner seperti yang diperlihatkan di snapshot layar berikutnya.

Heap dump biner dapat dibaca dengan jhatalat ini. Java SE 6 milik Sun menyertakan implementasi jhatpengganti HAT, yang sebelumnya tersedia sebagai unduhan terpisah. Hampir sepele untuk berlari jhat. Seseorang hanya perlu memanggil jhatfile heap dump yang dibuat dengan jmap(atau teknik pembuatan dump alternatif) seperti yang ditunjukkan di snapshot layar berikutnya.

Dengan heap dump yang dihasilkan ( jmap) dan jhatalat dipanggil, dump bisa dianalisis dengan browser web. Keluaran pada konsol memberi tahu kita bahwa dump tersedia pada port 7000 (port default ini dapat diganti dengan -portopsi). Ketika saya menjalankan peramban pada mesin yang sama yang saya jalankan jhat, saya dapat menggunakan localhostbagian host dari URL. Halaman awal menggunakan localhost dan port 7000 ditampilkan di snapshot layar berikutnya.

Pernyataan Arbitrary Object Query Language (OQL) dapat ditulis untuk menemukan detail yang diperlukan di heap dump. The jhatweb server -started termasuk OQL bantuan di URL // localhost: 7000 / oqlhelp /. Lihat juga Membuat Kueri Heap Java dengan OQL untuk detail selengkapnya tentang cara menggunakan OQL. Namun, seringkali seseorang dapat menemukan apa yang dibutuhkannya hanya dengan menggunakan informasi yang telah disediakan dan berpindah antar bagian informasi menggunakan hyperlink yang disediakan.

Cuplikan layar berikut menunjukkan salah satu halaman berguna yang tersedia berkat jhatkeluaran heap dump berbasis server web. Halaman ini menunjukkan jumlah instance berbagai objek Java, termasuk objek platform.

Bantuan signifikan dalam memahami maksud dari halaman web ini jhatadalah Spesifikasi VM pada Format File Kelas. Di Bagian 4.3.2 ("Field Descriptors") dokumen ini, terdapat tabel yang menunjukkan pemetaan karakter deskriptor kolom ke tipe data yang kita gunakan. Menurut tabel ini, "B" menunjukkan a byte, "C" menunjukkan a char, "D" menunjukkan a double, "F" menunjukkan a float, "I" menunjukkan integer, "J" menunjukkan a long, "L" menunjukkan referensi (contoh kelas), "Z" menunjukkan a boolean, dan [menunjukkan array.

Sejauh ini, saya telah melihat menggunakan jmapdan jhatdari baris perintah untuk menghasilkan heap dump dan menyediakan metode berbasis browser web untuk menganalisis heap dump yang dihasilkan. Meskipun alat ini relatif mudah digunakan, VisualVM menyediakan fungsionalitas serupa dalam pendekatan yang lebih mudah.

Salah satu metode untuk menghasilkan heap dump dalam Visual VM adalah dengan mengklik kanan pada proses yang diinginkan dan memilih "Heap Dump". Metode ini ditunjukkan di snapshot layar berikutnya.

Ini menghasilkan heap dump seperti yang ditunjukkan oleh namanya di bawah proses Java.

Pendekatan kedua untuk menghasilkan heap dump dengan VisualVM adalah mengklik proses Java yang diinginkan sehingga tab yang relevan ("Ikhtisar", "Monitor", "Utas", dan "Profiler") muncul di VisualVM. Memilih tab "Monitor" menyediakan tombol "Heap Dump" seperti yang ditunjukkan pada cuplikan layar berikutnya.

Mengklik tombol "Heap Dump" akan menghasilkan heap dump seperti pada opsi klik kanan yang dijelaskan di atas. Ini diperlihatkan di cuplikan layar berikutnya, yang terjadi dalam kasus ini untuk menampilkan tab "Ringkasan" dari heap dump yang dianalisis.

Selain tab "Ringkasan" dari analisis heap dump, detail menarik lainnya dari heap dump disajikan di tab "Kelas". Tab ini mencakup diagram batang horizontal yang secara grafis menunjukkan persentase dari total instance yang terkait dengan setiap kelas. Contoh ditampilkan di snapshot layar berikutnya.

Kelas yang ditampilkan dieja daripada menggunakan simbol seperti yang dijelaskan di atas untuk jhatanalisis heap dump berbasis. Seseorang dapat mengklik kanan kelas mana pun di tab "Kelas" dan memilih "Tampilkan dalam Tampilan Instans" untuk melihat detail pada setiap instance individu dari kelas yang dipilih. Ini ditampilkan di snapshot layar berikutnya.

Kesimpulan

VisualVM memberikan beberapa keuntungan saat membuat dan menganalisis heap dump. Pertama, segala sesuatu mulai dari pembuatan hingga analisis ada di satu tempat. Kedua, data disediakan dalam format yang dianggap lebih rapi dengan dukungan grafis. Terakhir, alat lain juga dapat digunakan dalam VisualVM sehubungan dengan analisis heap dump. VisualVM menyediakan one-stop shopping untuk banyak kebutuhan pengembangan, debugging, dan analisis kinerja dari pengembang Java.

Referensi Tambahan

⇒ Memecahkan Masalah Java SE

⇒ Panduan Mengatasi Masalah untuk Java SE 6 dengan HotSpot JVM (PDF)

⇒ Buku Putih Kinerja Java SE 6

⇒ Apa yang ada di Heap Java Saya?

⇒ Menganalisis Java Heaps dengan jmap dan jhat

⇒ Java Memory Profiling dengan jmap dan jhat

Artikel ini, "Heap Dump and Analysis with VisualVM", awalnya diterbitkan oleh JavaWorld.