2010-12-10 20 views
6

Bu JVM üzerinde bir OutOfMemoryException ortaya çıktığında yığın dökmek mümkün olduğunu biliyorum, ancak jmap veya jconsole gibi araçlarla canlı bir döküm sormak mümkün mü?Linux için ibm-jdk ile canlı bir yığın dökümü yapmanın bir yolu var mı?

+0

Amaç, yalnızca üretim ortamında oluşan bir sızıntı bulmaktır. Ben jvm duramıyorum ne de OutOfMemoryException (çok uzun) gerçekleşmesi için bekleyemezsiniz – Opty

cevap

3

Tamam, sonunda kendime cevap vereceğim: uygulamanın uzak yönetici arayüzü var, bu yüzden com.ibm.jvm.Dump.HeapDump() yöntemini çağıran yeni bir komut uygulayacağım.

0

Bence JProfiler gibi bir araç var. o güzel Eclipse

+0

Bu uygulamayı profillemek gerekir ki varsayalım ... Ayrıca Eclipse için TPTP profil aracı kullanacağız. Canlı bir üretim ortamında dökmem gerekiyor. – Opty

4

ile bir kaç seçenek var çalışmak edeceğiz:

Bu liste ayrıntılı değildir.

+0

Bu JVM'de JConsole ve HotSpot Diagnostic MBean'ı denediniz ve yığın dökümü için herhangi bir enstrümantasyon işlemi yok (belki win32 için kullanılabilir, ancak linux'da değil) – Opty

+0

Önceki yoruma bakıldığında, canlı dökümü oluşturmak için kullanılabilen tek yöntem dökümünü yapılandırmak gibi görünüyor JVM başlangıçta -Xdump kullanarak sigusr (olaylar = kullanıcı) üzerinde. Sorun şu ki, kontrolsüz SIGUSR, JVM'de zaman zaman meydana gelebilir ... – Opty

+0

@Opty - kullandığınız ürün hakkında fazla bir şey söylemezsiniz. Sistem döküntüleri oluşturmak için bazı alternatifler için buraya bakın: http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/javadump_trigger.html Not Linux'taki bazı kısıtlamalar: http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/dumpagents_platform_nonzos.html Neyi kontrol edeceğimi Bu, üretimde denemeden önce yük altında bir test sisteminin hafıza tüketimine yapar. – McDowell

6

"Sistem" dökümlerinin (temelde işletim sistemi çekirdek dosyaları) ve "yığın" aka taşınabilir yığın dökümü (PHD) olduğunu bilmeniz gerekir. Daha sonraki olanlar gerçek veriler içermediğinden daha az kullanışlıdır. Varsayılan olarak nasıl etkinleştirilirler.

AIX veya Linux'ta Genellikle bir yığın dökümü tetiklemek için kill -3 <pid> izin vermek için -Xdump:system (-Xdump:system:events=gpf+user için kısa) ayarlayacaksınız.

BTW, varsayılan seçeneklerle kill -ABRT <pid>'u kullanabilirsiniz. Ancak bu, JVM'nizi sonlandıracaktır. sistemde açıkken döker

> /usr/java6/bin/java -Xdump:what -version 

Registered dump agents 
---------------------- 
-Xdump:system: 
    events=gpf+abort+traceassert, 
    label=/home/u0002824/core.%Y%m%d.%H%M%S.%pid.%seq.dmp, 
    range=1..0, 
    priority=999, 
    request=serial 
---------------------- 
... 
java version "1.6.0" 
Java(TM) SE Runtime Environment (build pap3260sr9fp2-20110627_03(SR9 FP2)) 

:

> /usr/java6/bin/java -Xdump:system -Xdump:what -version 

Registered dump agents 
---------------------- 
-Xdump:system: 
    events=gpf+user+abort+traceassert, 
    label=/home/u0002824/core.%Y%m%d.%H%M%S.%pid.%seq.dmp, 
    range=1..0, 
    priority=999, 
    request=serial 
---------------------- 
-Xdump:heap: 
    events=systhrow, 
    filter=java/lang/OutOfMemoryError, 
    label=/home/u0002824/heapdump.%Y%m%d.%H%M%S.%pid.%seq.phd, 
    range=1..4, 
    priority=500, 
    request=exclusive+compact+prepwalk, 
    opts=PHD 
---------------------- 
-Xdump:java: 
    events=gpf+user+abort+traceassert, 
    label=/home/u0002824/javacore.%Y%m%d.%H%M%S.%pid.%seq.txt, 
    range=1..0, 
    priority=400, 
    request=exclusive+preempt 
---------------------- 
-Xdump:java: 
    events=systhrow, 
    filter=java/lang/OutOfMemoryError, 
    label=/home/u0002824/javacore.%Y%m%d.%H%M%S.%pid.%seq.txt, 
    range=1..4, 
    priority=400, 
    request=exclusive+preempt 
---------------------- 
-Xdump:snap: 
    events=gpf+abort+traceassert, 
    label=/home/u0002824/Snap.%Y%m%d.%H%M%S.%pid.%seq.trc, 
    range=1..0, 
    priority=300, 
    request=serial 
---------------------- 
-Xdump:snap: 
    events=systhrow, 
    filter=java/lang/OutOfMemoryError, 
    label=/home/u0002824/Snap.%Y%m%d.%H%M%S.%pid.%seq.trc, 
    range=1..4, 
    priority=300, 
    request=serial 
---------------------- 
... 

çekirdek üzerinde jre/bin/jextract çalıştırmayı unutmayın

Run java -Xdump:what gibi Varsayılanlarınızı görmek için. * .dmp dosyaları.

İlgili konular