대부분의 경우 엔터프라이즈 응용 프로그램에서 제공된 Java 힙은 최대 12-16GB의 이상적인 크기보다 큽니다. NetBeans 프로파일 러가 이러한 큰 Java 앱에서 직접 작동하는 것이 어렵다는 것을 알았습니다.
그러나 보통 이것은 필요하지 않습니다. jdk와 함께 제공되는 jmap 유틸리티를 사용하여 "실시간"힙 덤프를 수행 할 수 있습니다. 즉, jmap은 GC를 실행 한 후 힙을 덤프합니다. 응용 프로그램에서 일부 작업을 수행하고 작업이 완료 될 때까지 기다린 다음 다른 "라이브"힙 덤프를 가져 오십시오. Eclipse MAT와 같은 도구를 사용하여 힙 덤프를로드하고, 히스토그램을 정렬하고, 증가한 오브젝트 또는 가장 높은 오브젝트를 확인하십시오. 이것이 실마리를 제공합니다.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
이 방법에는 한 가지 문제 만 있습니다. 라이브 옵션을 사용하더라도 대용량 힙 덤프는 개발 랩으로 전송하기에는 너무 크며 메모리 / RAM이 충분한 머신이 필요할 수 있습니다.
그것이 클래스 히스토그램이 그려지는 곳입니다. jmap 도구를 사용하여 라이브 클래스 히스토그램을 덤프 할 수 있습니다. 이 클래스는 메모리 사용에 대한 클래스 히스토그램 만 제공합니다. 기본적으로 참조를 연결하는 정보는 없습니다. 예를 들어 char 배열을 맨 위에 놓을 수 있습니다. 그리고 아래 어딘가에 String 클래스가 있습니다. 연결을 직접 그려야합니다.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
두 개의 힙 덤프를 사용하는 대신 위에서 설명한 것처럼 두 개의 클래스 히스토그램을 사용하십시오. 그런 다음 클래스 히스토그램을 비교하고 증가하는 클래스를 확인하십시오. Java 클래스를 애플리케이션 클래스와 연관시킬 수 있는지 확인하십시오. 이것은 꽤 좋은 힌트를 줄 것입니다. 다음은 두 개의 jmap 히스토그램 덤프를 비교하는 데 도움이되는 pythons 스크립트입니다. histogramparser.py
마지막으로 JConolse 및 VisualVm과 같은 도구는 시간이 지남에 따라 메모리 증가를 확인하고 메모리 누수가 있는지 확인하는 데 필수적입니다. 마지막으로 문제는 메모리 누수가 아닌 메모리 사용량 일 수 있습니다.이를 위해 GC 로깅을 사용하도록 설정하십시오. jstat와 같은 jdk 도구를 사용하여 GC 동작을 실시간으로 볼 수 있습니다.
jstat -gccause pid <optional time interval>
-jhat, jmap, Full GC, Humongous 할당, G1GC에 대한 Google의 다른 참조