.hprof 파일을 어떻게 분석합니까?


227

다음 플래그로 실행중인 프로덕션 서버가 있습니다.- XX : + HeapDumpOnOutOfMemoryError

지난 밤에 서버에 힙 오류가 발생했을 때 java-38942.hprof 파일이 생성되었습니다. 시스템 개발자는 플래그를 알고 있지만 유용한 정보를 얻을 수있는 방법이 없다는 것이 밝혀졌습니다.

어떤 아이디어?

답변:


215

상당히 고급 도구를 사용하여 심각한 찌르기를 원한다면 Eclipse 의 Memory Analyzer 프로젝트 를보고 SAP가 제공 한 도구를 살펴보십시오 .

메모리 내 객체에 대해 제한된 SQL (OQL) 형식을 실행하는 것을 포함하여 메모리 누수 등을 찾는 데 매우 유용합니다.

com.yourcompany.somepackage.User에서 toString (firstName)을 선택하십시오.

정말 훌륭합니다.


18
Eclipse Memory Analyzer에 +100을 추가하고 싶습니다. 현재 400mb + 힙 덤프 파일을 선별하려고 시도 중이며 전체 JVM 충돌이 발생하기 전에 파일을 읽는 데 70 분 이상 jhat이 걸렸습니다. EMA는 <5 분 내에 열 수 있습니다.
matt b

3
Eclipse Memory Analyzer를 사용하여 HPROF 파일을 열 때 구문 분석 오류가 계속 발생합니다 (실제로 Eclipse에서도 덤프되었습니다!). 불행한 .. 한숨.
lost_bits1110

3
MAT는 여전히 많은 양의 RAM을 요구할 수 있습니다 [JHAT보다 작지만 여전히 약간의 비트]. 그러한 상황이 발생하면 팁을 보려면 stackoverflow.com/questions/7254017/… 를 참조하십시오 .
rogerdpack

71

JDK와 함께 기본적으로 제공되는 Java 힙 분석 도구 인 JHAT 를 사용할 수 있습니다 . 명령 줄이지 만 메모리를 검사하는 데 사용하는 웹 서버 / 브라우저를 시작합니다. 가장 사용자에게 친숙하지는 않지만 최소한 이미 대부분의 장소에 설치되어 있습니다. 매우 유용한 관점은 맨 아래에있는 "힙 히스토그램"링크입니다.

전의: jhat -port 7401 -J-Xmx4G dump.hprof

jhat OQL "이 요일"도 실행할 수 있습니다 (하단 링크 "execute OQL")


위의 명령을 실행 한 후 콘솔에서 터미널 "서버가 준비되었습니다"포트 : 7401 이라는 메시지가 표시됩니다 . 이 URL을 연 후 localhost : 7401 "브라우저 창에서 세부 정보를 볼 수 있습니다".
Laxman G

35

Netbeans Profiler 또는 Visual VM 독립형 도구 에서 HeapWalker 를 사용할 수도 있습니다 . Visual VM은 독립형이기 때문에 JHAT의 좋은 대안이지만 JHAT보다 사용하기가 훨씬 쉽습니다.

Visual VM을 완전히 사용하려면 Java 6 이상이 필요합니다.


이것은 Java 6 및 7에만 해당된다는 메모를 추가해야합니다.
Nick Stinemates

AFAIK, HeapWalker 및 VisualVM은 HPROF 파일을 읽는 데 Java 6/7이 필요하지 않습니다.
James Schek

방금 Java 5로로드하려고 시도했지만 'Java 6 또는 7을 사용하십시오'라고 말했습니다.
Nick Stinemates

흠. 아마도 Java 6을 실행해야하지만 Java 5 HPROF를 읽을 수 있습니다 (아마도 내가 작동하는 방식 일 수 있습니다). Java 5를 실행하는 앱에서 Visual VM에서 힙 덤프를 만들 수 없다는 것을 알고 있습니다. 업데이트됩니다.
James Schek

Java SDK에서 시각적 JVM을 사용할 수도 있습니다 jvisualvm.exe. JAVASDK/bin폴더를 찾으십시오
xxxvodnikxxx

11

Eclipse 메모리 분석기를 얻으십시오 . 더 나은 것은 없으며 무료입니다.

JHAT는 "장난감 응용 프로그램"에만 사용할 수 있습니다


3
JHAT는 LILO로 시작하여 BSD 배포판을 직접 빌드하는 "l33t"해커에게 깊은 인상을주기 위해 필요합니다. 잠깐만 ... 어쨌든 자바를 사용하지 않을 것입니다. :-)
James Schek

나는 이것이 더 많은 의견이라고 생각합니다 ... : \
rogerdpack


5

힙 덤프에 대한 사용자 정의 분석을 수행하려는 경우 다음이 있습니다.

이 라이브러리는 빠르지 만 분석 코드를 Java로 작성해야합니다.

문서에서 :

  • 힙 덤프를 처리하기 위해 디스크에 임시 파일을 작성하지 않습니다
  • GZ 압축 힙 덤프를 직접 사용할 수 있습니다
  • 힙 경로 표기법

2

개인적으로 VisualVM을 선호합니다. VisualVM에서 내가 좋아하는 기능 중 하나는 힙 덤프 비교입니다. 힙 덤프 분석을 수행 할 때 충돌의 원인을 파악하는 다양한 방법이 있습니다. 내가 찾은 유용한 방법 중 하나는 정상 및 비정상 힙 덤프를 비교하는 것입니다.

다음은 수행 할 수있는 단계입니다.

  1. OutOfMemoryError의 힙 덤프를 가져 오면 "oome.hprof"라고합니다. JVM 매개 변수 HeapDumpOnOutOfMemoryError를 통해이를 얻을 수 있습니다.
  2. 응용 프로그램에 따라 응용 프로그램을 다시 시작하여 큰 시간 (분 / 시간) 동안 실행하십시오. 응용 프로그램이 계속 실행되는 동안 다른 힙 덤프를 가져옵니다. "healthy.hprof"라고하겠습니다.
  3. VisualVM에서이 덤프를 모두 열고 힙 덤프 비교를 수행 할 수 있습니다. 수업이나 패키지 수준에서 할 수 있습니다. 이것은 종종 문제의 방향을 알려줄 수 있습니다.

링크 : https://visualvm.github.io

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