2016-12-12 4 views
13

메모리 누수가 발생했으며 여기에 세부 사항이 있습니다.힙 분석 후 Java 힙 덤프와 힙 크기가 다릅니다.

At the time of after-leak, 
    - top shows 50GB memory as residential 
    - heap dump file size is 25GB 
    - eclipse MAT analyzer tells me the heap size is 10GB 

At the time of before-leak, 
    - top shows 30GB memory as residential 
    - heap dump file size is 20GB 
    - eclipse MAT analyzer tells me the heap size is 10GB 

위로, 힙 덤프 크기 및 실제 힙 크기의 차이에 놀랐습니다. 상단과 힙의 차이점은 가비지 수집기 힙 및 원시 힙 영역의 가능성이라고 생각합니다. 그러나 힙 덤프 파일 크기와 실제 힙 크기 (eclipse MAT 분석기 사용)는 어떻게 다를 수 있습니까?

이 문제에 대한 통찰력이 있으십니까?

UPDATE/답변

제안 중 일부는 웹 사이트가 "기본 메모리 추적을"지시로 (https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html)을 jcmd 사용한다. 주의 깊게 페이지를 참조한다면, 당신은

Since NMT doesn't track memory allocations by non-JVM code, 
you may have to use tools supported by the operating system 
to detect memory leaks in native code. 

그래서, 네이티브 라이브러리 내부 누출의 경우, 옵션 jcmd하지 않습니다 볼 수 있습니다.

며칠 동안 Internet을 크롤링하고 다양한 프로파일 러를 사용해 본 결과,이 문제에 가장 효과적인 것은 jemalloc 프로파일 러를 사용하는 것입니다.

이 페이지는 많은 도움이되었습니다. https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/

+1

이 http://stackoverflow.com/questions/36872551/relation-between-memory-host-and-memory-arguments-xms-and-xmx-from-java/보기 36927242 # 36927242 – apangin

+1

기타 흥미로운 링크 https://plumbr.eu/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx 및 https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t –

답변

2

나는 비슷한 상황을 경험했다. 차이점 (HPROF 파일 크기 - MAT로 표시된 힙의 크기)은 실제로 가비지 (도달 할 수없는 개체)입니다. 도달 할 수없는 개체 MAT의 히스토그램이 여기서 도움이 될 것입니다.

jmap -F -dump:live,format=b,file=<file_name.hprof> <process_id>은 garbages가 아닌 살아있는 물체만을 덤프합니다.

+0

감사합니다. 하지만 여전히 주거 크기와 힙 크기의 차이를 알아야합니다. – jaeyong

3

top 및 기타 OS 레벨 도구는 JVM 프로세스의 시스템 메모리 사용량을 표시합니다. -Xmx 명령 행 옵션으로 정의되는 Java 힙은 해당 메모리의 일부일뿐입니다. 힙 외에도 JVM은 자체 메모리가 필요합니다. 그런 다음 자바 스레드가 있으며 각각은 일정량의 메모리를 필요로합니다. 그리고 Metaspace/Permanent Generation. 그리고 몇몇 다른 사람. 자세한 내용은 this blog postthis SO answer을 참조하십시오.

덤프 파일의 크기와 실제 힙 크기에 관해서는 @ arnab-biswas의 대답이 확실합니다. MAT는 실제로 사용 된 힙의 크기를 실제 객체가 사용하는 것으로보고합니다. 그러나 힙 덤프에는 쓰레기를 포함하여 전체 힙이 들어 있습니다.

+0

답해 주셔서 감사합니다. NativeMemoryTracking을 제안하는 것처럼 보이지만 네이티브 라이브러리 자체에서 메모리 할당을 추적하지는 않습니다. 이 코드는 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html에 따라 Java 코드 할당 만 추적 할 수 있습니다. "NMT는 비 JVM 코드에 의한 메모리 할당을 추적하지 않기 때문에 운영 체제가 지원하는 도구를 사용하여 원시 코드에서 메모리 누수를 감지해야 할 수 있습니다." – jaeyong

0

기본 메모리를 모니터링하려면 -XX:NativeMemoryTracking=summary 또는 -XX:NativeMemoryTracking=detail으로 응용 프로그램을 시작해야합니다. 성능상의 불이익이 있음을 유의하십시오. 따라서 프로덕션 환경에서 작업하기 전에 두 번 생각하십시오.

메모리 추적이 활성화되어있는 경우 jcmd <pid> VM.native_memory summary을 사용할 수 있습니다. 다른 명령도 사용할 수 있습니다. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html을 확인하거나 기본 메모리 추적을 검색하십시오.

편집 : 대답하기 전에 링크를 따라 가지 않았으므로 대신 https://github.com/jeffgriffith/native-jvm-leaks과 같은 것을 찾을 수 있습니다.

0

힙 덤프 : 힙 덤프는 특정 시점에서의 Java 프로세스 메모리의 스냅 샷입니다.이 데이터를 유지하기위한 다양한 형식이 있으며 형식에 따라 정보의 다른 부분이 포함될 수 있지만 일반적으로 스냅 샷에는 스냅 샷이 트리거 된 순간의 힙에있는 Java 객체 및 클래스에 대한 정보가 들어 있습니다. 일반적으로 힙 덤프가 작성되기 전에 전체 GC가 트리거되어 나머지 개체에 대한 정보가 포함됩니다. 당신은 신뢰할 수/공식 소스에서 그리기 답변을 요구하는 http://help.eclipse.org/neon/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

0

MAT관련 내용

는 여기. 내가 한번 시도해 보자.

1) JVM 프로세스에서 소비 한 메모리 (윗 그림)가 힙 크기보다 큰 이유는 무엇입니까?

JVM 프로세스의 총 메모리 소비는 Java 힙 이외의 많은 것들로 구성되기 때문에. 몇 가지 예 :

- Generated (JIT:ed) code 
- Loaded libraries (including jar and class files) 
- Control structures for the java heap 
- Thread Stacks 
- User native memory (malloc:ed in JNI) 

믿기지/공식 소스 : Run-Time Data Areasthis blog post

2) 왜 어떤 MAT 보고서보다 힙 덤프의 크기가 훨씬 더 큰입니까?

매트에 전체 힙이 표시되지 않기 때문에. 인덱스 작성 중에 메모리 분석기는 도달 할 수없는 오브젝트를 제거합니다. 다양한 가비지 컬렉터 알고리즘이 일부 쓰레기를 남겨 두는 경향이 있기 때문입니다.

믿기지/공식 소스 : MemoryAnalyzer/FAQ