Sebagian besar waktu, dalam aplikasi perusahaan tumpukan Java yang diberikan lebih besar dari ukuran ideal maksimal 12 hingga 16 GB. Saya merasa sulit untuk membuat profiler NetBeans bekerja langsung pada aplikasi-aplikasi java besar ini.
Tetapi biasanya ini tidak diperlukan. Anda dapat menggunakan utilitas jmap yang datang dengan jdk untuk mengambil heap dump "hidup", yaitu jmap akan membuang heap setelah menjalankan GC. Lakukan beberapa operasi pada aplikasi, tunggu sampai operasi selesai, lalu ambil tumpukan heap "langsung". Gunakan alat seperti Eclipse MAT untuk memuat heapdumps, mengurutkan pada histogram, melihat objek mana yang telah meningkat, atau mana yang tertinggi, Ini akan memberikan petunjuk.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Hanya ada satu masalah dengan pendekatan ini; Tumpukan tumpukan besar, bahkan dengan opsi live, mungkin terlalu besar untuk dipindahkan ke putaran pengembangan, dan mungkin memerlukan mesin dengan memori / RAM yang cukup untuk dibuka.
Di situlah histogram kelas muncul. Anda dapat membuang histogram kelas langsung dengan alat jmap. Ini hanya akan memberikan histogram kelas penggunaan memori. Pada dasarnya itu tidak akan memiliki informasi untuk rantai referensi. Sebagai contoh dapat menempatkan array char di bagian atas. Dan kelas String di suatu tempat di bawah ini. Anda harus menggambar koneksi sendiri.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Alih-alih mengambil dua heap dump, ambil dua histogram kelas, seperti yang dijelaskan di atas; Kemudian membandingkan histogram kelas dan melihat kelas-kelas yang meningkat. Lihat apakah Anda dapat menghubungkan kelas Java ke kelas aplikasi Anda. Ini akan memberikan petunjuk yang cukup bagus. Berikut ini adalah skrip python yang dapat membantu Anda membandingkan dua dump histogram jmap. histogramparser.py
Akhirnya alat seperti JConolse dan VisualVm sangat penting untuk melihat pertumbuhan memori dari waktu ke waktu, dan melihat apakah ada kebocoran memori. Akhirnya kadang-kadang masalah Anda mungkin bukan kebocoran memori, tetapi penggunaan memori yang tinggi. Untuk ini memungkinkan GC logging, gunakan GC pemadatan yang lebih maju dan baru seperti G1GC; dan Anda dapat menggunakan alat jdk seperti jstat untuk melihat langsung perilaku GC
jstat -gccause pid <optional time interval>
Referensi lain ke google untuk -jhat, jmap, GC Penuh, alokasi Humongous, G1GC