[java] 대용량 Java 힙 덤프 분석 도구

분석하고 싶은 HotSpot JVM 힙 덤프가 있습니다. VM이로 실행되었으며 -Xmx31g힙 덤프 파일의 크기는 48GB입니다.

  • jhat힙 메모리의 약 5 배 (내 경우에는 240GB)가 필요하고 몹시 느리기 때문에 시도하지도 않을 것입니다.
  • Eclipse MAT ArrayIndexOutOfBoundsException는 몇 시간 동안 힙 덤프를 분석 한 후 충돌 합니다.

해당 작업에 사용할 수있는 다른 도구는 무엇입니까? 힙 덤프를 분석을 위해 효율적인 데이터 구조로 변환하는 하나의 프로그램과 사전 구조화 된 데이터에 대해 작동하는 여러 다른 도구로 구성된 명령 줄 도구 제품군이 가장 좋습니다.



답변

일반적으로 내가 사용하는 것은 Eclipse Memory Analyzer에ParseHeapDump.sh 포함되어 있으며 여기 에 설명 되어 있으며 더 강화 된 서버 중 하나에서 수행합니다 (linux .zip 배포판을 통해 다운로드 및 복사, 압축 해제). 셸 스크립트는 GUI에서 힙을 구문 분석하는 것보다 적은 리소스가 필요하며 더 많은 리소스를 사용하여 강력한 서버에서 실행할 수 있습니다 ( 스크립트의 마지막 줄 끝에 비슷한 것을 추가하여 더 많은 리소스를 할당 할 수 있습니다 . 예를 들어, 해당 파일의 마지막 줄은 수정 후 다음과 같을 수 있습니다.-vmargs -Xmx40g -XX:-UseGCOverheadLimit

./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit

그것을 실행 ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof

성공하면 .hprof 파일 옆에 여러 “인덱스”파일이 생성됩니다.

인덱스를 만든 후에는 보고서를 생성하고 해당 보고서를 내 로컬 컴퓨터로 scp하고 그로 인해 범인을 찾을 수 있는지 확인하려고합니다 (인덱스가 아니라 보고서뿐 아니라). 다음 은 보고서 작성에 대한 자습서입니다 .

예제 보고서 :

./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

기타 보고서 옵션 :

org.eclipse.mat.api:overvieworg.eclipse.mat.api:top_components

해당 보고서가 충분하지 않고 더 많은 파기를 필요로하는 경우 (예 : oql을 통해), 색인과 hprof 파일을 로컬 머신에 scp 한 다음 힙 덤프를 엽니 다 (인덱스가 동일한 디렉토리에 있음). 내 Eclipse MAT GUI로 힙 덤프). 거기에서 실행하는 데 너무 많은 메모리가 필요하지 않습니다.

편집 :
나는 두 가지 메모를 추가하는 것을 좋아했습니다.

  • 내가 아는 한, 인덱스 생성 만이 Eclipse MAT의 메모리 집약적 인 부분입니다. 인덱스가 있으면 Eclipse MAT에서 처리하는 대부분의 경우 그다지 많은 메모리가 필요하지 않습니다.
  • 쉘 스크립트에서이 작업을 수행한다는 것은 헤드리스 서버에서 수행 할 수 있다는 것을 의미합니다 (일반적으로 가장 강력한 서버이기 때문에 일반적으로 헤드리스 서버에서도 수행합니다). 그리고 해당 크기의 힙 덤프를 생성 할 수있는 서버가 있다면 그 정도의 힙 덤프도 처리 할 수있는 다른 서버가있을 가능성이 있습니다.


답변

이 관련 질문에 대한 대답은 좋은 출발점이 될 것입니다 (힙 덤프 대신 라이브 jmap 히스토그램 사용).

대용량 Java 힙 덤프에서 메모리 누수를 찾는 방법

대부분의 다른 힙 분석기 (IBM http://www.alphaworks.ibm.com/tech/heapanalyzer 사용 )는 멋진 GUI 도구를 기대하는 경우 힙보다 최소한 백분율 이상의 RAM이 필요합니다.

그 외에도 많은 개발자가 라이브 스택 분석과 같은 대체 접근 방식을 사용하여 무슨 일이 일어나고 있는지 파악합니다.

왜 당신의 힙이 그렇게 큰지 의문을 제기해야하지만? 할당 및 가비지 수집에 미치는 영향은 엄청납니다. 힙에있는 것의 많은 부분이 실제로 데이터베이스 / 영구 캐시 등에 저장되어야한다고 확신합니다.


답변

YourKit을 사용하는 것이 좋습니다. 일반적으로 힙 덤프 크기보다 약간 적은 메모리가 필요합니다 (인덱싱하고 해당 정보를 사용하여 원하는 것을 검색합니다).


답변

몇 가지 추가 옵션 :

이 사람 http://blog.ragozin.info/2015/02/programatic-heapdump-analysis.html

실제로 파일을 메모리에로드하는 대신 힙 덤프 파일을 통해 “쿼리 스타일”인터페이스를 노출하는 사용자 지정 Netbeans 힙 분석기를 작성했습니다.

https://github.com/aragozin/jvm-tools/tree/master/hprof-heap

“그의 쿼리 언어”가 여기에서 허용되는 답변에 언급 된 일식 OQL보다 나은지 모르겠지만.

JProfiler 8.1 (사용자 라이센스에 499 달러)은 많은 돈을 사용하지 않고도 큰 힙을 순회 할 수 있다고 합니다.


답변

첫 번째 단계 : MAT에 할당하는 RAM의 양을 늘리십시오. 기본적으로 그다지 많지 않으며 큰 파일을 열 수 없습니다.

MAC (OSX)에서 MAT를 사용하는 경우 MemoryAnalyzer.app/Contents/MacOS에 MemoryAnalyzer.ini 파일이 있습니다. 해당 파일을 조정하고 “취득”하도록하는 것은 저에게 효과적이지 않았습니다. 대신이 파일의 내용을 기반으로 수정 된 시작 명령 / 셸 스크립트를 만들고 해당 디렉터리에서 실행할 수 있습니다. 제 경우에는 20GB 힙을 원했습니다.

./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

터미널을 통해 Contents / MacOS 디렉토리에서이 명령 / 스크립트를 실행하면 더 많은 RAM을 사용할 수있는 GUI를 시작할 수 있습니다.


답변

그리 잘 알려진 도구 – http://dr-brenschede.de/bheapsampler/은 큰 힙에 적합합니다. 샘플링 방식으로 작동하므로 약간 까다 롭지 만 전체 내용을 읽을 필요가 없습니다.


답변

Eclipse Memory Analyzer의 최신 스냅 샷 빌드에는 메모리 소비를 줄이고 나머지 오브젝트를 분석 할 수 있도록 특정 비율의 오브젝트를 무작위로 버리는 기능이 있습니다. 다음 MAT 릴리스에 포함되기 전에이 기능을 테스트 하려면 버그 563960야간 스냅 샷 빌드 를 참조하십시오 .