Java Heap Dumps'ı nasıl güvenilir bir şekilde alabilirim?


9

Ekibim, OutOfMemoryErrors tarafından tetiklenen iyi yığın dökümlerini almaya çalışırken zorluklarla karşılaşıyor. Belirli nedenlerle şu anda HeapDumpOnOutOfMemoryError bayrağını kullanmak yerine bash betiğinden çağrılan jmap ile dökümleri alıyoruz. Yığın boyutu 3 GB civarında olan 64 bit 1.6 JVM kullanıyoruz. Bizim yığın dökümü zamanın% 90'ı başarısız (tahmin).

Bellek sorunlarını gidermek için kullanabileceğimiz temiz bir yığın dökümü alma olasılığımızı artırmak için yapabileceğimiz bir şey var mı? Java 1.4'te jmap'ın önemli sorunları olduğunu okudum, ancak bu sorunların çoğunlukla ele alınması gerekiyor.


4
Bu soruyu "en kasıtsız iğrenç sesler" için aday gösterdim.
phoebus

1
Hah- Kasten iğrenç geliyor diye düşündüm ama burada yeniyim ve topluluğun bunu nasıl alacağından emin değildim :).
karlcyr

Yanıtlar:


7

İşletim sisteminiz hangisi? (Yorum ekleyemiyorum).

Solaris için önce bir çekirdek dökümü ( gcore <pid>) zorlamak ve sonra çekirdek dökümü dosyasına jmap eklemek ( jmap -heap:format=b <path to java bin> <path to core>)

gcoreçalışan bir programın görüntüsünü oluşturmak için bir * nix yardımcı programıdır. Bkz. Bağlantı .


Linux üzerinde gdb ile çalıştı ve harika çalışıyor.
Christian

hangi JDK'da "gcore" vardır? benim, Sun 32 bit jdk için linux 1.6.0.20 yok.
djangofan

Gcore açıklama ile düzenlendi.
fglez

2

ManagementFactory.getThreadMXBean () öğesini sorgulayan ve bir rapor üreten bir JSP'ye sahibiz. Uygulama çöktüğünde yararlı olmayabilir, ancak her dakika anket yaparsanız, neler olduğu hakkında bir fikir edinirsiniz.

Daha fazla bilgi burada.


2

uygulamanızı dışarıdan jmx üzerinden izleyebilirsiniz. yaklaşan bir OutOfMemory'yi gösteren bazı metrikler biliyorsanız, kural dışı durum atılmadan önce bir jmap çalışmasını tetikleyebilirsiniz.


Teşekkürler Christian- jmap hata atılmadan önce güvenilir olması daha olası mı?
karlcyr

jmap, size bir yığın dökümü almak için biraz zamana ihtiyaç duyacaktır. ancak jvm / tomcat'ınız çoğunlukla sorumlu olduğu sürece tam bir yığın alacaksınız.
Christian

Bunu yapmak için en temiz ve en kolay araç "Görsel VM" olduğunu düşünüyorum. Kapsam dışı olabilir, ancak VisualVM için koşulu algılayan ve VisualVm içinden otomatik dökümü alan özel bir eklenti yapmak harika IMHO olacaktır.
djangofan

2

Önerileriniz için hepinize teşekkürler.

Yaptığımız şey, çöp toplama günlüklerini aktif olarak izlemek için bir senaryo yazmaktır. Deneyimlerimize göre, arka arkaya Tam GC'ler neredeyse her zaman bir OOM'dan önce gelir, bu nedenle komut dosyamız bu olayı algılar, sunucuyu yük dengeleme havuzundan zarif bir şekilde kaldırır ve yığın dökümünü zorlar. Bu, etkinliğimizi büyük ölçüde artırdı.


2

Bu oldukça eski bir soru, ama birisinin bunu yararlı bulacağı umuduyla cevap vereceğim.

jmap bir -F seçeneğine (kuvvet) sahiptir. Bunun geçmişte benim için iyi çalışmadığını kanıtladı. -F seçeneğini kullanacaksanız, javap komutunun bir parçası olarak java.io.tmp dizinini de belirtmenizi öneririm. JVM yardımcı programı geçici dizin ayarı nedeniyle düzgün çalışmadığı JVM sürüm 1.6.22 ile ilgili bir sorun oluştu.

Ayrıca gdb aracılığıyla bir çekirdek dökümü almaya çalışabilirsiniz. Çekirdeğe sahip olduğunuzda, jmap çekirdeği bir yığın dökümü haline dönüştürebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.