자바 분리 수 거 전략 원리 상세 설명


세대 별 쓰레기 회수 전략 은 이러한 사실 을 바탕 으로 한다.서로 다른 대상 의 생명 주 기 는 다르다.따라서 수명 주기 별 대상 은 회수 효율 을 높이 기 위해 다양한 수집 방식 을 취 할 수 있다.
자바 프로그램 이 실행 되 는 과정 에서 대량의 대상 이 발생 하 는데 그 중에서 일부 대상 은 업무 정보 와 관련 이 있다.예 를 들 어 Http 요청 중의 Session 대상,스 레 드,Socket 연결 등 대상 은 업무 와 직접 연결 되 기 때문에 생명 주기 가 비교적 길다.그러나 일부 대상 은 주로 프로그램 이 실행 되 는 과정 에서 생 성 된 임시 변수 이다.이런 대상 의 생명 주 기 는 비교적 짧다.예 를 들 어 String 대상 은 변 하지 않 는 유형의 특성 때문에 시스템 은 대량의 이런 대상 을 생 성하 고 일부 대상 은 심지어 한 번 만 사용 하면 회수 할 수 있다.
대상 의 생존 시간 구분 을 하지 않 고 쓰레기 수 거 를 할 때마다 쌓 인 공간 전 체 를 수 거 하 는 데 시간 이 상대 적 으로 오래 걸 리 는 동시에 수 거 할 때마다 모든 생존 대상 을 옮 겨 다 녀 야 하기 때 문 이지 만 실제로 수명 주기 가 긴 대상 에 게 이런 옮 겨 다 니 는 것 은 효과 가 없다.여러 번 옮 겨 다 닐 수 있 기 때문이다.하지만 그들 은 여전히 존재 한다.따라서 세대 별 쓰레기 수 거 는 분 리 된 사상 으로 세대 별로 구분 하고 서로 다른 생명 주기의 대상 을 서로 다른 세대 에 두 고 서로 다른 세대 에 가장 적합 한 쓰레기 수 거 방식 으로 수 거 한다.
어떻게
그림 에서 보 듯 이:

가상 컴퓨터 의 총 세 대 는 젊 은 세대(Young Generation),늙 은 세대(Old Generation)와 지구 대(Permanent Generation)로 나 뉜 다.그 중에서 지구 대 는 주로 자바 류 의 유형 정 보 를 저장 하고 쓰레기 수집 이 수집 해 야 할 자바 대상 과 관계 가 크 지 않다.젊 은 세대 와 늙 은 세대 의 구분 은 쓰레기 수집 에 큰 영향 을 미친다.
젊 은 세대:
모든 새로 생 성 된 대상 은 우선 젊 은 세대 에 놓 여 있다.젊 은 세대 의 목 표 는 가능 한 한 생명 주기 가 짧 은 대상 을 빨리 수집 하 는 것 이다.젊 음 은 세 구역 으로 나 뉜 다.하나의 Eden 구역,두 개의 Survivor 구역(일반적으로).대부분의 대상 은 Eden 지역 에서 생 성 됩 니 다.Eden 구역 이 가득 찼 을 때 살아 남 은 대상 은 Survivor 구역(둘 중 하나)으로 복 사 됩 니 다.이 Survivor 구역 이 가득 찼 을 때 이 구역 의 생존 대상 은 다른 Survivor 구역 으로 복 사 됩 니 다.이 Survivor 구역 도 가득 찼 을 때 첫 번 째 Survivor 구역 에서 복 사 된 것 이 고 이때 살아 남 은 대상 은'나이 든 지역(Tenured)'으로 복 사 됩 니 다.주의해 야 할 것 은 Survivor 의 두 구역 은 대칭 적 이 고 선후 관계 가 없 기 때문에 같은 구역 에 Eden 에서 복 제 된 대상 이 동시에 존재 할 수 있 고 예전 의 Survivor 에서 복 제 된 대상 과 나이 든 지역 으로 복 제 된 대상 은 첫 번 째 Survivor 구역 에서 온 대상 만 있 습 니 다.그리고 Survivor 구역 중 하 나 는 비어 있 습 니 다.또한 프로그램 수요 에 따라 Survivor 구역 은 여러 개(두 개 이상)로 설정 할 수 있 으 며,이 는 대상 이 젊 은 세대 에 존재 하 는 시간 을 늘 리 고,늙 은 세대 에 방 치 될 가능성 을 줄 일 수 있다.
신세대 에는 에덴,From Survivor,To Survivor 세 부분 으로 나 뉘 는데 이들 이 대응 하 는 메모리 공간의 크기 비율 은 8:1 이다.즉,대상 에 게 메모 리 를 할당 할 때 에덴 공간 을 먼저 사용 하고 GC 를 거 친 후에 회수 되 지 않 은 것 은 From Survivor 구역 에 먼저 들어간다.모두 Survivorq 구역(From Survivor 또는 To Survivor)을 완전히 남 겨 두 고 있 습 니 다.즉,신세대 의 메모리 이 용 률 은 최대 90%입 니 다.From Survivor 와 To Survivor 두 영역 은 GC 의 실제 상황 에 따라 호 환 되 며 From Survivor 영역 에 있 는 대상 을 모두 To Survivor 영역 으로 복사 하거나 반대로 To Survivor 영역 에 있 는 대상 을 모두 From Survivor 영역 으로 복사 합 니 다.
연로 대:
젊 은 세대 에서 쓰레기 수 거 N 회 를 겪 고도 살아 남 은 대상 자 는 노대 에 두 게 된다.따라서 연로 대 에 보 관 된 것 은 모두 수명 주기 가 긴 대상 이 라 고 볼 수 있다.
GC 과정 에서 어떤 대상 이 여러 차례 GC 를 거 쳐 회수 되 지 않 으 면 연로 대 에 들 어 갈 수 있다.또는 신세대 가 대상 에 게 메모 리 를 분배 할 공간 이 충분 하지 않 을 때 세대 별로 직접 분배 할 수 있다.
지구 대:
정적 파일 을 저장 하 는 데 사용 되 며,현재 자바 클래스,방법 등 이 있 습 니 다.지구 대 는 쓰레기 회수 에 현저 한 영향 을 미 치지 않 지만 일부 응용 프로그램 은 동적 으로 생 성 되 거나 일부 class,예 를 들 어 Hibernate 등 을 호출 할 수 있 습 니 다.이 럴 때 이러한 운행 과정 에서 추 가 된 종 류 를 저장 하기 위해 비교적 큰 지구 대 공간 을 설정 해 야 합 니 다.지구 대 크기 는-XX:MaxPermSize=을 통 해 설정 합 니 다.
영구 대 는 실제 적 으로 가상 컴퓨터 가 실 행 될 때 데이터 구역 의'방법 구역'에 대응 하 는데 여 기 는 주로 유형 정보,정적 변수,상수 등 데 이 터 를 저장 합 니 다.일반적으로 영구 세대 에서 대응 하 는 대상 의 GC 는 효율 이 매우 낮다.왜냐하면 이곳 의 대부분 대상 이 작 동 할 때 GC 를 하지 않 기 때문에 JVM 이 종 료 될 때 까지 계속 이용 된다.
3.어떤 상황 에서 쓰레기 수 거 를 촉발 합 니까?
대상 을 나 눠 처리 한 만큼 쓰레기 수 거 구역,시간 도 달 랐 다.GC 는 두 가지 유형 이 있 는데 그것 이 바로 Scavenge GC 와 Full GC 이다.
Scavenge GC
일반적으로 새 대상 이 생 성 되 고 Eden 신청 공간 이 실 패 했 을 때 Scavenge GC 를 터치 하여 Eden 구역 에 GC 를 진행 하여 비 생존 대상 을 제거 하고 생존 대상 을 Survivor 구역 으로 이동 합 니 다.그리고 Survivor 의 두 구역 을 정리 합 니 다.이런 방식 의 GC 는 젊 은 세대 의 에덴 존 에 진행 되 는 것 으로 세대 에 영향 을 주지 않 는 다.대상 대부분이 에덴 구 에서 시작 되 는 동시에 에덴 구가 크게 배정 되 지 않 기 때문에 에덴 구 의 GC 는 빈번하게 진행 된다.따라서 보통 이곳 에 서 는 속도 가 빠 르 고 효율 이 높 은 알고리즘 을 사용 하여 Eden 이 가능 한 한 빨리 시간 을 낼 수 있 도록 해 야 한다.
Young,Tenured,Perm 을 포함 하여 전체 더 미 를 정리 합 니 다.풀 GC 는 블록 전 체 를 회수 해 야 하기 때문에 스 캐 븐 지 GC 보다 느 리 기 때문에 풀 GC 횟수 를 최대한 줄 여야 한다.JVM 을 개선 하 는 과정 에서 많은 작업 은 바로 FullGC 에 대한 조절 이다.다음 과 같은 이유 로 Full GC 가 발생 할 수 있 습 니 다.
·연로 대(Tenured)작성
  • 지구 대(Perm)가 꽉 찼 다
  • System.gc()호출 된 것 으로 나 타 났 습 니 다
  • 지난번 GC 이후 Heap 의 각 도 메 인 배분 전략 동태 변화
  • 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기