메모리 분석 기 도구 (MAT) 를 사용 하여 메모리 누 출 분석 (1) ZZ

10147 단어 memory
http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 왜 MAT 를 써 요?
 
이전의 관점 에서 저 는 실시 간 profiling / monitoring 같은 도 구 를 사용 하여 메모리 누 출 이 어디 에 있 는 지 매우 실시 간 으로 분석 하 는 것 이 정확 하 다 고 생각 합 니 다.연초 한 프로 파 일 러 도 구 를 사용 해 메시지 중간 에 존재 하 는 메모리 누 출 을 테스트 한 결과, 스루풋 이 많 을 때 프로 파 일 러 도구 자체 도 응답 하지 못 해 골 치 아 팠 다.나중에 이런 도구 자체 가 성능 을 소모 해 야 하고 어떤 조건 에서 도 누설 되 지 않 는 다 는 것 을 알 게 되 었 다.그래서 오프라인 데 이 터 를 분석 하 는 것 이 매우 중요 하 다. MAT 는 바로 이런 도구 이다.
 
메모리 가 넘 치 는 이 유 는 무엇 입 니까?
 
JVM 은 generation (세대) 에 따라 GC 를 진행 하 는 것 을 알 고 있 습 니 다. 다음 그림 에 따 르 면 모두 young generation (젊 은 세대), tenured generation (옛날 시대), permanent generation (영구 세대, perm gen), perm gen (또는 Non - heap) 으로 나 뉘 어 집 니 다. 비 더미) 는 이류 입 니 다. 잠시 후에 말씀 드 리 겠 습 니 다.힙 공간 은 perm gen 을 포함 하지 않 습 니 다.절대 다수의 대상 은 young generation 에서 배정 되 고 young generation 에서 회수 되 며 young generation 의 공간 이 채 워 지면 GC 는 minor collection (회수) 을 진행 합 니 다. 이번 회 수 는 heap 의 다른 generation 과 관련 되 지 않 습 니 다. minor collection 은 weak generation hypothesis (약 한 연대 가설) 에 따 르 면young generation 에서 대량의 대상 이 쓰레기 라 고 가정 하면 회수 해 야 하고 minor collection 의 과정 이 매우 빠 를 것 이다.young generation 에서 회수 되 지 않 은 대상 은 tenured generation 으로 옮 겨 졌 으 나 tenured generation 도 채 워 져 최종 적 으로 major collection (주 회수) 을 촉발 합 니 다. 이번 회 수 는 전체 힙 을 대상 으로 대량의 대상 과 관련 되 기 때문에 minor collection 보다 훨씬 느 립 니 다.
 
JVM 에는 세 가지 쓰레기 회수 기 가 있 습 니 다. 각각 throughput collector 입 니 다. young generation 을 병행 하여 회수 할 수 있 습 니 다. 매개 변수 - XX: + UseParallelGC 에서 시작 합 니 다.concurrent low pause collector, tenured generation 동시 회수 에 사용 되 며, 매개 변수 - XX: + UseConcMarkSweetGC 에서 시작 합 니 다.incremental low pause collector 는 기본 쓰레기 회수 기 라 고 볼 수 있 습 니 다.어떤 쓰레기 수 거 기 를 직접 사용 하 는 것 을 권장 하지 않 으 며, JVM 이 자신 이 충분히 파악 하지 않 는 한 스스로 결단 을 내 리 는 것 이 좋다.
 
Heap 의 generation 공간 은 어떻게 구분 합 니까?JVM 의 - Xmx = n 인 자 를 통 해 최대 힙 공간 을 지정 할 수 있 으 며, -Xms=n 최소 힙 공간 을 지정 할 수 있 습 니 다.JVM 을 초기 화 할 때 최소 힙 공간 이 최대 힙 공간 보다 작 으 면 위의 그림 에서 보 듯 이 JVM 은 사용 하지 않 은 공간 을 Virtual 로 표시 합 니 다.이 두 개의 인 자 를 제외 하고 - XX: MinHeapFreeRatio = n 과 -XX: MaxHeapFreeRatio = n 은 최대, 최소 의 남 은 공간 과 활동 대상 의 비율 을 각각 제어 합 니 다.32 비트 Solaris SPARC 운영 체제 에서 기본 값 은 다음 과 같 습 니 다. 32 비트 windows xp 에서 기본 값 도 많 지 않 습 니 다.
매개 변수
기본 값
MinHeapFreeRatio
40
MaxHeapFreeRatio
70
-Xms
3670k
-Xmx
64m
tenured generation 의 major collection 이 느 리 기 때문에 tenured generation 공간 이 young generation 보다 작 으 면 빈번 한 major collection 을 초래 하여 효율 에 영향 을 줄 수 있 습 니 다.서버 JVM 의 기본 적 인 young generation 과 tenured generation 공간 비율 은 1: 2 입 니 다. 즉, young generation 의 eden 과 survivor 공간의 합 은 전체 힙 (물론 perm gen 포함 되 지 않 음) 의 3 분 의 1 입 니 다. 이 비율 은 - XX: NewRatio = n 매개 변 수 를 통 해 제어 할 수 있 고 Client JVM 의 기본 적 인 - XX: NewRatio 는 8 입 니 다.young generation 공간 크기 를 조정 하 는 뉴 사이즈 = n 과 맥 스 뉴 사이즈 = n 인 자 는 말 하지 않 겠 습 니 다. 다음 자 료 를 참고 하 십시오.
 
young generation 에서 살아 남 은 대상 은 tenured generation 으로 옮 겨 졌 지만 불행 하 게 도 concurrent collector 스 레 드 가 여기에서 major collection 을 진행 하고 회수 작업 이 끝나 기 전에 공간 이 소 진 되 었 습 니 다. 이 때 Full Collections (Full GC) 가 발생 하여 회수 가 완 료 될 때 까지 전체 응용 프로그램 이 중단 되 었 습 니 다.Full GC 는 고부 하 생산 환경의 악몽...
 
현재 클래스 perm gen 은 자바 언어 수준 에서 설명 할 수 없 는 대상 을 저장 하 는 JVM 입 니 다. 이 대상 들 은 클래스 와 방법 데이터 (class loader 와 관련), intened strings (문자열 상주) 입 니 다.일반적으로 32 비트 OS 에서 perm gen 은 기본 64m 로 매개 변수 - XX: MaxPermSize = n 을 통 해 지정 할 수 있 습 니 다. JVM Memory Structure 한 글 에 따 르 면 이 지역 에 대해 더 상세 한 문헌 이 없고 신비 합 니 다.
 
질문 으로 돌아 가기 "왜 메모리 가 넘 칩 니까?"이 질문 에 대답 하고 또 다른 화 제 를 끌 어 내 려 면 어떤 대상 인 GC 가 회수 할 수 있 습 니까?물론 GC 가 어떤 reference chain (참조 체인) 을 통 해 대상 에 접근 할 수 없다 는 것 을 발 견 했 을 때 이 대상 은 회수 된다.명사 GC Roots 는 바로 이 과정 을 분석 하 는 출발점 이다. 예 를 들 어 JVM 은 스스로 대상 의 도달 성 을 확보 했다 (그러면 JVM 은 GC Roots). 그래서 GC Roots 는 이렇게 메모리 에서 대상 의 도달 성 을 유지 하고 도착 하지 못 하면 회수 된다.보통 GC Roots 는 current thread (현재 스 레 드) 의 call stack (호출 스 택) 의 대상 (예 를 들 어 방법 파라미터 와 부분 변수) 또는 스 레 드 자체 또는 system class loader (시스템 클래스 로 더) 가 불 러 온 클래스 와 native code (로 컬 코드) 가 유지 하 는 활동 대상 입 니 다.그래서 GC Roots 는 분석 대상 이 왜 메모리 에 살아 있 는 지 분석 하 는 이기 이다.어떤 대상 GC 가 회수 되 는 지 알 게 된 후 대상 인용 에 어떤 내용 이 포함 되 어 있 는 지 배 워 보 자.
 
최 강 에서 최 약 까지 서로 다른 인용 (도달 가능) 단 계 는 대상 의 생명 주 기 를 반영 한다.
l  Strong Ref (강 참조): 보통 우리 가 작성 한 코드 는 Strong Ref 입 니 다. 이에 대응 하 는 것 은 강 한 접근 성 입 니 다. 강 한 접근 성 을 제거 해 야 대상 이 회 수 됩 니 다.
l  Soft Ref (소프트 참조): 소프트 접근 성에 대응 하여 충분 한 메모리 만 있 으 면 대상 을 유지 하고 메모리 가 부족 하고 Strong Ref 가 없 을 때 까지 대상 을 회수 합 니 다.일반적으로 캐 시 를 실현 할 수 있 으 며, 자바. lang. ref. softReference 류 를 통 해 이 루어 집 니 다.
l  Weak Ref (약 인용): Soft Ref 보다 약 합 니 다. Strong Ref 가 존재 하지 않 는 다 는 것 을 발견 하면 즉시 대상 을 회수 하고 메모리 가 부족 할 때 까지 기다 리 지 않 아 도 됩 니 다.자바. lang. ref. Weak Reference 와 자바. util. Weak HashMap 류 를 통 해 이 루어 집 니 다.
l  Phantom Ref (가상 참조): 메모리 에 대상 을 유지 하지 않 습 니 다. Phantom Ref 자체 만 사용 할 수 있 습 니 다.일반적으로 finalize () 방법 에 들 어간 후 특수 한 청소 과정 을 통 해 java. lang. ref. PhantomReference 구현.
 
위의 여러 가지 가 있 으 면 힙 과 perm gen 을 쉽게 깨 뜨 릴 수 있 을 거 라 고 믿 습 니 다. 네, Strong Ref 를 이용 하여 힙 이 터 질 때 까지 대량의 데 이 터 를 저장 합 니 다.intened strings (또는 class loader 를 이용 하여 대량의 클래스 를 불 러 옵 니 다) 를 이용 하여 perm gen 을 터 뜨 립 니 다.
 
shallow size, retained size 에 대하 여
 
Shallow size 는 대상 자체 가 메모리 의 크기 를 차지 하 는 것 으로 다른 대상 에 대한 인용 을 포함 하지 않 습 니 다. 즉, 대상 헤더 에 구성원 변 수 를 추가 하 는 것 (구성원 변수의 값 이 아 닙 니 다) 의 총화 입 니 다.32 비트 시스템 에서 대상 머리 는 8 바이트, int 는 4 바이트 를 차지 합 니 다. 구성원 변수 (대상 또는 배열) 가 다른 대상 (인 스 턴 스) 을 인용 하 든 안 하 든 값 을 null 로 할당 하 든 항상 4 바이트 를 차지 합 니 다.따라서 String 대상 인 스 턴 스 의 경우 int 멤버 3 명 (3 * 4 = 12 바이트), char [] 멤버 1 명 (1 * 4 = 4 바이트) 과 대상 헤드 (8 바이트) 가 있 으 며 총 3 * 4 + 1 * 4 + 8 = 24 바이트 입 니 다.이 원칙 에 따 르 면 String a = 'rosen jiang' 에 게 실례 a 의 shallow size 도 24 바이트 입 니 다.
 
Retained size 는 이 대상 자체 의 shallow size 이 며, 이 대상 에서 대상 에 직접 또는 간접 적 으로 접근 할 수 있 는 shallow size 의 합 이다.다시 말 하면 retained size 는 이 대상 이 GC 에 의 해 회 수 된 메모리 의 합계 이다.retained size 를 잘 이해 하기 위해 서 는 예 를 들 어 보 자.
 
메모리 의 대상 을 다음 그림 의 노드 로 보고 대상 과 대상 간 에 서로 참조 합 니 다.여기에 특수 한 노드 GC Roots 가 있 습 니 다. 정 해!이것 이 바로 reference chain 의 출발점 이다.obj 1 에서 착안 하여 위의 그림 에서 파란색 노드 는 obj 1 을 통 해서 만 직접적 이거 나 간접 적 으로 접근 할 수 있 는 대상 을 대표 한다.GC Roots 를 통 해 접근 할 수 있 기 때문에 왼쪽 그림 의 obj 3 는 파란색 노드 가 아 닙 니 다.오른쪽 그림 은 리 테 인 드 집합 에 포함 되 어 있 기 때문에 파란색 이다.그래서 왼쪽 그림 에 대해 obj 1 의 retained size 는 obj 1, obj 2, obj 4 의 shallow size 총화 입 니 다.오른쪽 그림 의 retained size 는 obj 1, obj 2, obj 3, obj 4 의 shallow size 총화 입 니 다.obj 2 의 retained size 는 같은 방식 으로 계산 할 수 있 습 니 다.
 
Heap Dump
 
힙 덤 프 는 특정 시간 대, 자바 프로 세 스 의 메모리 스냅 샷 입 니 다.이 데 이 터 를 저장 하 는 형식 이 다 릅 니 다. 전체적으로 스냅 샷 이 실 행 될 때 자바 대상 과 클래스 가 힙 에 있 는 상황 을 포함 합 니 다.스냅 샷 은 한 순간의 일이 기 때문에 힙 덤 프 에는 대상 이 언제, 어디서 (어떤 방법 에서) 분배 되 었 는 지 에 대한 정 보 를 포함 할 수 없습니다.
 
플랫폼 과 자바 버 전에 따라 힙 덤 프 를 가 져 오 는 방법 이 다 르 며, MAT 에 필요 한 것 은 HPOF 형식의 힙 덤 프 바 이 너 리 파일 입 니 다.인공 적 으로 관여 하지 않 으 려 면 JVM 인 자 를 이렇게 설정 해 야 합 니 다. - XX: - HeapDumpOnOutOfmory Error, 오류 가 발생 하면 자동 으로 힙 덤 프 가 생 성 되 며, 생산 환경 에 서 는 이런 방식 만 사용 합 니 다.힙 덤 프 가 언제 생 성 되 는 지 스스로 제어 하고 싶다 면 윈도 우즈 + JDK 6 환경 에서 제 이 콘 솔 도 구 를 사용 할 수 있 고 리 눅 스 나 맥 OS X 환경 에서 JDK 5, 6 자체 의 jmap 도 구 를 사용 할 수 있다.물론 JVM 인 자 를 설정 할 수 있 습 니 다. - XX: + HeapDumpOnCtrlBreak, 즉 콘 솔 에서 Ctrl + Break 키 를 사용 하여 heap dump 를 생 성 할 수 있 습 니 다.저 는 windows + JDK 5 이기 때문에 - XX: - HeapDumpOnOutOfmory Error 라 는 방식 을 선 택 했 습 니 다. 더 많은 설정 은 참고 하 시기 바 랍 니 다 MAT Wiki.
 
참고 자료
 
MAT Wiki Interned Strings Strong,Soft,Weak,Phantom Reference Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine Permanent Generation Weak References 번역문 이해 Java HotSpot VM Options Shallow and retained sizes JVM Memory Structure GC roots 주의 하 세 요!인용, 리 트 윗 본 고 는 원작 자: Rosen Jiang 과 출처 를 밝 혀 야 한다.  http://www.blogjava.net/rosen

좋은 웹페이지 즐겨찾기