OutOfMemoryException이이 JVM에서 발생했을 때 힙을 덤프하는 것이 가능하지만 jmap 또는 jconsole과 같은 도구로 라이브 덤프를 요청할 수 있습니까?Linux에서 ibm-jdk로 라이브 힙 덤프를 수행하는 방법이 있습니까?
답변
오케이, 마침내 나에게 답할 것입니다. 애플리케이션에 원격 관리 인터페이스가 있으므로 com.ibm.jvm.Dump.HeapDump()
메서드를 호출하는 새 명령을 구현할 것입니다.
JProfiler와 같은 도구가 하나 있다고 생각합니다. 멋지게 이클립스
그게 내가 프로파일 링 할 필요가 있다고 가정했을 것이다 ... 게다가 Eclipse 용 TPTP 프로파일 링 툴을 사용할 것이다. 라이브 프로덕션 환경에서 덤프해야합니다. – Opty
와 함께 당신은 몇 가지 옵션이 작동거야 :
이 목록은 완전하지 않다.
이 JVM에서 시도한 JConsole 및 HotSpot 진단 MBean 및 힙을 덤프하는 데 사용할 수있는 계측 작업이 없습니다 (Win32에서는 사용할 수 있지만 Linux에서는 사용할 수 없음) – Opty
이전 주석에 대해서는 라이브 덤프를 생성하는 데 사용할 수있는 유일한 방법은 덤프를 구성하는 것입니다 jvm startup에서 -Xdump를 사용하여 sigusr (events = user)에 저장하십시오. 문제는 제어되지 않는 SIGUSR이 JVM에서 때때로 발생할 수 있다는 것입니다 ... – Opty
@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
"시스템 덤프 (기본적으로 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 파일
목적은 프로덕션 환경 상황에서만 발생하는 누출을 찾는 것입니다. 나는 jvm을 멈추거나 OutOfMemoryException이 발생할 때까지 기다릴 수 없다. (너무 길다) – Opty