대용량 Java 힙 덤프 분석 도구


80

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

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

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


덤프가 손상되지 않았고 DTFJ JAR의 최신 버전을 사용하고 있습니까? ArrayIndexOutOfBoundsException최소한 두 가지 버그 의 기능 . 다른 수정 사항이있는 MAT를 실행할 때 OOME을 보고하지 않았기 때문에 이것을 말합니다 .
Vineet 레이놀즈

jhat은 힙에 저장된 객체 수에 따라 기하 급수적으로 증가하는 읽기 객체를 저장하기 위해 heapMap을 사용합니다. 한 가지 옵션은 decl을 heapMap에서 TreeMap으로 변경하고 jhat의 힙 크기를 최소한 프로세스만큼 크게 실행하는 것입니다.
codeDr 2013 년

답변:


80

일반적으로 내가 사용하는 것은 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에서 처리하는 대부분의 경우 그다지 많은 메모리가 필요하지 않습니다.
  • 쉘 스크립트에서이 작업을 수행한다는 것은 헤드리스 서버에서 수행 할 수 있다는 것을 의미합니다 (일반적으로 가장 강력한 서버이기 때문에 일반적으로 헤드리스 서버에서도 수행합니다). 그리고 해당 크기의 힙 덤프를 생성 할 수있는 서버가 있다면 그 정도의 힙 덤프도 처리 할 수있는 다른 서버가있을 가능성이 있습니다.

4
중요 사항 : ParseHeapDump.shOSX 버전이 아닌 Linux 버전으로 만 패키징됩니다.- eclipse.org
Christopher

이 작업을 시도하면 (리눅스 상자에서 bash를 시도 함) "Unable to initialize GTK +"와 함께 즉시 실패합니다. 따라서 (현재 버전, 2016-04-15) 여전히 UI (?)와 대화하고 있다고 생각합니다.
Charles Roth

2
최신 버전의 ParseHeapDump.sh는 ./MemoryAnalyzer를 직접 실행하려고합니다. 지금까지 java -Xmx16g -Xms16g -jar plugins / org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar -consoleLog -consolelog -application과 같이 Java로 직접 실행기를 실행하는 실험을하고 있습니다. org.eclipse.mat.api.parse "$ @"
Charles Roth

Linux 및 OSX 버전을 모두 다운로드하여 OS X에서 사용할 수 있으며 ParseHeapDump.sh를 MemoryAnalyze 파일 (제 경우에는 ~ / Downloads / mat.app / Contents / MacOS)과 동일한 디렉터리에 복사하고 수정하고 거기에서 실행하십시오. 또는 SSH를 통해 원격 서버에서 실행하십시오. :)
rogerdpack

500MB 이하의 메모리를 사용하는 Eclipse Memory Analyzer GUI로 2GB 힙 덤프를 열었습니다. 색인 파일은 파일을 열 때 즉석에서 생성되었습니다 (~ 30 초 소요). 도구를 개선했을 수도 있습니다. 실제로 이런 식으로 작동한다면 큰 파일을 앞뒤로 복사하는 것보다 더 편리합니다. 콘솔 유틸리티 없이도 작은 메모리 풋 프린트는 저에게 큰 장점입니다. 하지만 솔직히 말해서 정말 큰 덤프 (50GB 이상)로 시도하지 않았습니다 . 이 도구로 큰 덤프를 열고 분석하는 데 얼마나 많은 메모리가 필요한지 매우 흥미 롭습니다.
Ruslan Stelmachenko

6

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

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

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

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

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


5

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


4

몇 가지 추가 옵션 :

이 사람 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 달러)은 많은 돈을 사용하지 않고도 큰 힙을 순회 할 수 있다고 합니다.


실제로 github.com/on-site/fasthat 과 달리 큰 덤프에서 작동합니다 . 좋은!
Jesse Glick

4

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

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

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

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


감사. 오늘 유틸리티를 DL했습니다. 2x 클릭으로 실행을 시도했지만 오류가 발생했습니다. 로그를보고 데이터 파일을 만들 수 없으며 스위치를 사용한다고합니다. .app 패키지를 열고 \ MacOS가 아닌 Eclipse \ 폴더에서 MemoryAnalyzer.ini를 찾았습니다. 아하! 그래서 모든 파일을 로컬에서 추출하고 제안한대로 수행했습니다. \ MacOS에 .sh 파일을 만들고 Eclipse \ MemoryAnalyzer.ini의 명령을 평평한 한 줄로 옮겼습니다. 저장된 파일. 명령 줄에서 MacOS \의 .sh 파일을 실행하면 잘 작동합니다.
Matt Campbell

2

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


불행히도 "일반적인 문제 : 메모리 부족 : -Xmx를 덤프 크기의 2/3로 늘리십시오"라고 말하지만 충분한 RAM이 있거나 서버에서 실행할 수 있다면 충분할 것입니다. 감사합니다. !
rogerdpack

2

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


1

이것은 명령 줄 솔루션은 아니지만 도구를 좋아합니다.

힙 덤프를 호스트하기에 충분히 큰 서버에 복사하십시오. 원래 서버를 사용할 수있는 가능성이 매우 높습니다.

ssh -X그래픽 도구를 원격으로 실행 하려면 서버를 입력하고 jvisualvmJava 바이너리 디렉토리에서 사용 .hprof하여 힙 덤프 파일 을로드합니다 .

이 도구는 전체 힙 덤프를 한 번에 메모리로로드하지 않지만 필요할 때 부품을로드합니다. 물론 파일을 충분히 살펴보면 필요한 메모리가 마침내 힙 덤프 크기에 도달합니다.


0

큰 .hprof 분석에 좋은 jprofiler를 사용해보십시오. 약 22GB 크기의 파일로 시도했습니다.

https://www.ej-technologies.com/products/jprofiler/overview.html

0

JXray라는 흥미로운 도구를 발견했습니다. 제한된 평가판 라이센스를 제공합니다. 메모리 누수를 찾는 것이 매우 유용하다는 것을 알았습니다. 당신은 그것을 시도 할 수 있습니다.

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