프로그래밍 언어/JAVA

[툴] 이클립스 MAT(Memory Analyzer)

투칼론 2023. 3. 12. 16:53
반응형

(다운로드) http://www.eclipse.org/mat/

(매뉴얼) https://www.eclipse.org/mat/documentation/

(동영상) https://vimeo.com/21356498

 

MAT 실행 시에 MemoryAnalyzer.ini 파일에서 Heap 크기를 여유있게 설정 후에 실행해야 합니다.

 

문서는 아래 URL을 참고하여 작성한 내용입니다.

(참고URL) https://help.eclipse.org/latest/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

 

1. 힙덤프 파일 열기

"File >  Open Heap Dump... " 메뉴를 통해 힙덤프 파일을 오픈합니다.

오른쪽에는 덤프의 크기와 클래스, 객체 및 클래스 로더의 수가 표시됩니다.

덤프의 총 크기가 파일 크기보다 훨씬 작은 경우 힙 덤프에 다음 가비지 수집 시 폐기될 많은 'garbage' 객체가 포함되었을 수 있습니다. 이러한 'garbage' 객체를 검사하려면 연결할 수 없는 객체(unreachable objects) 쿼리를 참조하십시오.

2. 히스토그램(Historgram) 정보 가져오기

도구 모음에서 히스토그램 아이콘을 선택하여 클래스당 인스턴스 수, swallow 크기 및 retained 크기를 나열합니다.

MAT은 기본적으로 개별 객체의 retained 크기를 표시합니다. 그러나 객체 집합의 retained 크기(이 경우 특정 클래스의 모든 인스턴스)를 계산해야 합니다.

 

모든 행의 retained 크기를 추정하려면 도구 모음에서 "계산 아이콘"을 선택합니다. 또는 몇 개의 행을 선택하고 컨텍스트 메뉴를 사용하면 됩니다.

MAT을 매우 강력하게 만드는 한 가지는 객체 집합에 대해 모든 작업을 실행할 수 있다는 사실입니다. 필요 시 객체를 Drill-Down하고 별도 나누어 선택하면 됩니다.

또 다른 중요한 기능은 히스토그램을 클래스 로더, 패키지 또는 수퍼클래스별로 그룹화하는 기능입니다.

애플리케이션은 서로 다른 클래스 로더에 의해 서로 다른 구성 요소를 로드합니다. 메모리 분석기는 클래스 로더에 의미 있는 레이블을 첨부합니다. 

패키지별로 히스토그램을 그룹화하면 Java 패키지 계층 구조를 따라 Drill-Down 할 수 있습니다.

슈퍼클래스별로 히스토그램을 그룹화하면 예를 들어 java.util.AbstractMap 등의 모든 서브클래스를 쉽게 찾을 수 있습니다.

3. 도미네이터 트리(Dominator Tree) 보기

Dominator Tree는 힙 덤프에서 가장 큰 객체를 표시합니다. Tree의 다음 수준에는 부모 노드에 대한 모든 incoming references가 제거되어 Garbage Collected 예정되어 있는 객체가 나열됩니다.

Dominator Tree는 어떤 객체가 다른 개체를 활성 상태로 유지하는지 조사하는 강력한 도구입니다.

4. GC 루트 패스(Path to GC Roots)

GC 루트는 VM 자체에 의해 활성 상태로 유지되는 객체입니다. 예를 들어 현재 실행 중인 스레드의 스레드 객체, 현재 호출 스택에 있는 객체 및 시스템 클래스 로더에 의해 로드된 클래스가 포함됩니다. 

 

객체에서 GC 루트까지의 (역) 참조 체인(소위 GC 루트에 대한 경로)은 객체가 garbage collected 될 수 없는 이유를 설명합니다. 경로는 Java의 메모리 누수를 해결하는 데 도움이 됩니다. 이러한 누수는 프로그램 논리가 객체에 더 이상 액세스하지 않더라도 객체가 계속 참조되기 때문에 존재합니다.

처음에는 최단 경로로 도달한 GC 루트가 선택됩니다.

5. Leak 레포트 생성

MAT은 힙 덤프에서 누수가 의심되는지 검사할 수 있습니다. 예를들어, 의심스러울 정도로 큰 객체 또는 객체 집합.