2010-12-10 2 views
6

OutOfMemoryException이이 JVM에서 발생했을 때 힙을 덤프하는 것이 가능하지만 jmap 또는 jconsole과 같은 도구로 라이브 덤프를 요청할 수 있습니까?Linux에서 ibm-jdk로 라이브 힙 덤프를 수행하는 방법이 있습니까?

+0

목적은 프로덕션 환경 상황에서만 발생하는 누출을 찾는 것입니다. 나는 jvm을 멈추거나 OutOfMemoryException이 발생할 때까지 기다릴 수 없다. (너무 길다) – Opty

답변

3

오케이, 마침내 나에게 답할 것입니다. 애플리케이션에 원격 관리 인터페이스가 있으므로 com.ibm.jvm.Dump.HeapDump() 메서드를 호출하는 새 명령을 구현할 것입니다.

0

JProfiler와 같은 도구가 하나 있다고 생각합니다. 멋지게 이클립스

+0

그게 내가 프로파일 링 할 필요가 있다고 가정했을 것이다 ... 게다가 Eclipse 용 TPTP 프로파일 링 툴을 사용할 것이다. 라이브 프로덕션 환경에서 덤프해야합니다. – Opty

4

와 함께 당신은 몇 가지 옵션이 작동거야 :

이 목록은 완전하지 않다.

+0

이 JVM에서 시도한 JConsole 및 HotSpot 진단 MBean 및 힙을 덤프하는 데 사용할 수있는 계측 작업이 없습니다 (Win32에서는 사용할 수 있지만 Linux에서는 사용할 수 없음) – Opty

+0

이전 주석에 대해서는 라이브 덤프를 생성하는 데 사용할 수있는 유일한 방법은 덤프를 구성하는 것입니다 jvm startup에서 -Xdump를 사용하여 sigusr (events = user)에 저장하십시오. 문제는 제어되지 않는 SIGUSR이 JVM에서 때때로 발생할 수 있다는 것입니다 ... – Opty

+0

@Offpty - 사용중인 제품에 대해 많이 말하지 않습니다. 시스템 덤프 생성을위한 몇 가지 대안은 다음을 참조하십시오. http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/javadump_trigger.html 참고 Linux의 일부 제한 사항 : http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/dumpagents_platform_nonzos.html 생산을 시도하기 전에 부하가 걸린 테스트 시스템의 메모리를 소비합니다. – McDowell

6

"시스템 덤프 (기본적으로 OS 코어 파일) 및"힙 (heap) "휴대용 힙 덤프 (PHD)이라는 사실을 알고 있어야합니다. 나중의 것들은 실제 데이터를 포함하지 않으므로 덜 유용합니다. 그들은 기본적으로 활성화되어 있습니다.

AIX 또는 Linux의 경우 kill -3 <pid>이 힙 덤프를 트리거 할 수있게하려면 일반적으로 -Xdump:system (약자는 -Xdump:system:events=gpf+user)을 설정해야합니다.

현재 기본 옵션으로 kill -ABRT <pid>을 사용할 수 있습니다. 그러나 이것은 JVM을 종료합니다. 시스템에 켜진 덤프

> /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 
---------------------- 
... 

코어 jre/bin/jextract를 실행하는 것을 잊지 마세요

실행 java -Xdump:what처럼, 당신의 기본값을 볼 수 있습니다. * .dmp 파일