Tim saya mengalami kesulitan ketika mencoba untuk melakukan heap dump yang dipicu oleh OutOfMemoryErrors. Untuk alasan tertentu kami saat ini mengambil dump dengan jmap dipanggil dari skrip bash alih-alih menggunakan bendera HeapDumpOnOutOfMemoryError. Kami menggunakan JVM 64-bit 1.6 dengan ukuran tumpukan sekitar 3 GB. Tumpukan tumpukan kami gagal 90% dari waktu (perkiraan).
Apakah ada yang bisa kita lakukan untuk meningkatkan peluang kita mendapatkan timbunan sampah yang bersih yang bisa kita gunakan untuk memecahkan masalah memori? Saya telah membaca bahwa jmap memiliki masalah besar di Jawa 1.4 tetapi masalah-masalah itu sebagian besar harus diatasi sekarang.
java
oom
outofmemoryerror
dump
Karlcyr
sumber
sumber
Jawaban:
Yang mana sistem operasi Anda? (Saya tidak bisa menambahkan komentar).
Untuk Solaris, kami mendapatkan hasil yang lebih baik, pertama-tama memaksa dump inti (
gcore <pid>
) dan kemudian melampirkan jmap ke file dump inti (jmap -heap:format=b <path to java bin> <path to core>
)gcore
adalah utilitas * nix untuk menghasilkan gambar dari program yang sedang berjalan. Lihat tautan .sumber
kami memiliki JSP yang menanyakan ManagementFactory.getThreadMXBean () dan menghasilkan laporan. Mungkin tidak berguna saat aplikasi mogok, tetapi jika Anda melakukan jajak pendapat setiap menit, Anda akan mengetahui apa yang terjadi.
Info lebih lanjut di sini.
sumber
Anda dapat memonitor aplikasi Anda melalui jmx dari luar. ketika Anda mengetahui beberapa metrik yang mengindikasikan OutOfMemory yang akan datang, Anda bisa memicu jmap berjalan sebelum pengecualian dilempar.
sumber
Terima kasih untuk semua saran Anda.
Yang akhirnya kami lakukan adalah menulis skrip untuk secara aktif memantau log pengumpulan sampah. Dalam pengalaman kami, back-to-back Full GC hampir selalu mendahului OOM, jadi skrip kami mendeteksi peristiwa ini, dengan anggun menghapus server dari kumpulan penyeimbang beban, dan memaksa tumpukan timbunan. Ini telah sangat meningkatkan efektivitas kami.
sumber
Ini adalah pertanyaan yang cukup lama, tetapi saya akan menjawab dengan harapan bahwa seseorang dapat menemukan ini berguna.
jmap memiliki opsi -F (force). Ini terbukti tidak berhasil dengan baik di masa lalu bagi saya. Jika Anda ingin menggunakan opsi -F, saya akan merekomendasikan Anda juga menentukan direktori java.io.tmp sebagai bagian dari perintah jmap. Ada masalah dengan JVM versi 1.6.22 di mana utilitas jmap tidak berfungsi dengan baik karena pengaturan direktori temp.
Anda juga dapat mencoba mengambil dump inti melalui gdb. Setelah Anda memiliki inti, jmap dapat mengubah inti menjadi tumpukan tumpukan.
sumber