Java 힙 덤프를 안정적으로 가져 오는 방법?


9

OutOfMemoryErrors에 의해 트리거 된 힙 덤프를 가져 오려고 할 때 팀이 어려움을 겪고 있습니다. 특정 이유로 우리는 현재 HeapDumpOnOutOfMemoryError 플래그를 사용하는 대신 bash 스크립트에서 호출 된 jmap으로 덤프를 가져옵니다. 우리는 약 3GB의 힙 크기를 가진 64 비트 1.6 JVM을 사용하고 있습니다. 힙 덤프는 90 %의 시간 동안 실패합니다 (추측).

메모리 문제를 해결하는 데 사용할 수있는 클린 힙 덤프를 얻을 가능성을 개선하기 위해 할 수있는 일이 있습니까? jmap에 Java 1.4에서 주요 문제가 있었지만 이러한 문제는 대부분 해결해야한다는 것을 읽었습니다.


4
나는이 질문을 "가장 뜻하지 않게 역겨운 소리"로 지목한다.
피버스

1
Hah- 나는 의도적으로 역겨운 소리를내는 것에 대해 생각했지만 여기에 새로 왔으며 커뮤니티가 어떻게 그것을 취할지 확신하지 못했습니다 :).
karlcyr

답변:


7

운영 체제는 무엇입니까? (댓글을 추가 할 수 없습니다).

Solaris의 경우 먼저 코어 덤프 ( gcore <pid>)를 강제 실행 한 다음 jmap을 코어 덤프 파일 ( jmap -heap:format=b <path to java bin> <path to core>)에 첨부 하여 더 나은 결과를 얻습니다.

gcore실행중인 프로그램의 이미지를 생성하는 * nix 유틸리티입니다. 링크를 참조 하십시오 .


리눅스에서 gdb로 시도해 보았습니다.
Christian

어떤 JDK에 "gcore"가 있습니까? 광산, 리눅스 1.6.0.20 용 Sun 32 비트 jdk에는 없습니다.
djangofan

gcore 설명으로 편집했습니다.
fglez

2

우리는 ManagementFactory.getThreadMXBean ()을 쿼리하고 보고서를 생성하는 JSP를 가지고 있습니다. 앱이 다운되었을 때는 유용하지 않을 수 있지만 1 분마다 설문 조사를하면 무슨 일이 일어나고 있는지 알 수 있습니다.

자세한 정보는 여기에 있습니다.


2

외부에서 jmx를 통해 응용 프로그램을 모니터링 할 수 있습니다. 예정된 OutOfMemory를 나타내는 일부 메트릭을 알고 있으면 예외가 발생하기 전에 jmap 실행을 트리거 할 수 있습니다.


감사합니다 Christian- 오류가 발생하기 전에 jmap을 신뢰할 수 있습니까?
karlcyr

jmap은 여전히 ​​힙 덤프를 얻는 데 약간의 시간이 필요합니다. 그러나 jvm / tomcat이 대부분 책임이있는 한 전체 힙 덤프를 얻게됩니다.
Christian

가장 깨끗하고 쉬운 방법은 "Visual VM"이라고 생각합니다. 범위를 벗어 났을 수도 있지만 조건을 감지하고 VisualVm 내에서 자동 덤프를 가져 오는 VisualVM 용 사용자 정의 플러그인을 만드는 것은 멋진 IMHO가 될 것입니다.
djangofan

2

제안 해 주셔서 감사합니다.

우리가 마무리 한 것은 가비지 수집 로그를 적극적으로 모니터링하는 스크립트를 작성하는 것입니다. 경험상 Back-to-Back Full GC는 거의 항상 OOM보다 앞서 있으므로 스크립트는이 이벤트를 감지하고로드 밸런싱 풀에서 서버를 정상적으로 제거하고 힙 덤프를 강제 실행합니다. 이것은 우리의 효과를 크게 향상 시켰습니다.


2

이것은 상당히 오래된 질문이지만 누군가가 이것을 유용하게 사용할 수 있기를 바랍니다.

jmap에는 -F 옵션 (force)이 있습니다. 이것은 과거에는 저에게 잘 작동하지 않는 것으로 입증되었습니다. -F 옵션을 사용하려면 jmap 명령의 일부로 java.io.tmp 디렉토리도 지정하는 것이 좋습니다. 임시 디렉토리 설정으로 인해 jmap 유틸리티가 제대로 작동하지 않는 JVM 버전 1.6.22에 문제가있었습니다.

gdb를 통해 코어 덤프를 시도 할 수도 있습니다. 코어가 있으면 jmap은 코어를 힙 덤프로 변환 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.