JVM 의 쓰레기 회수 알고리즘 작업 원리 상세 설명
모두 2 가지 방법 이 있 는데,계수 법 과 접근 성 분석 을 인용 한다.
1.인용 계수 법
인용 계수 법 이란 모든 대상 에 인용 계수 기 를 설정 하 는 것 이다.한 곳 에서 이 대상 을 인용 할 때마다 계수 기 를 하나 더 하고 인용 이 실 효 될 때 계수 기 는 하 나 를 줄인다.대상 의 인용 카운터 가 0 일 때 이 대상 이 인용 되 지 않 았 음 을 나타 낸다.즉,'죽은 대상'은 쓰레기 로 회수 된다.
인용 계수 법 은 순환 인용 문 제 를 해결 하지 못 하 는 결함 이 있다.즉,대상 A 가 대상 B 를 인용 하고 대상 B 가 대상 A 를 인용 하면 이때 A,B 대상 의 인용 계수 기 는 0 이 되 지 않 아 쓰레기 수 거 를 완성 하지 못 하기 때문에 주류 가상 컴퓨터 는 이런 알고리즘 을 사용 하지 않 았 다.
public classReferenceFindTest{
publicstaticvoidmain(String[] args){
MyObject object1 = new MyObject();
MyObject object2 = new MyObject();
object1.object = object2;
object2.object = object1;
object1 = null;
object2 = null;
}
}
2.접근 성 알고리즘(참조 체인 법)이 알고리즘 은 GC Roots 라 고 불 리 는 대상 부터 아래로 검색 하고 대상 에서 GC Roots 까지 인용 체인 이 연결 되 지 않 으 면 이 대상 을 사용 할 수 없다 는 것 을 의미한다.
자바 에 서 는 GC Roots 의 대상 으로 다음 과 같은 몇 가지 가 있 습 니 다.
가상 컴퓨터 스 택 에서 인용 한 대상방법 구역 류 정적 속성 참조 대상
방법 구역 상수 탱크 참조 대상
로 컬 방법 스 택 JNI 참조 대상
이 알고리즘 들 은 한 대상 이 회수 되 는 지 여 부 를 판단 할 수 있 지만 상기 조건 을 만족 시 킬 때 한 대상 이 반드시 회수 되 는 것 은 아니다.대상 이 GC Root 에 도달 하지 못 할 때 이 대상 은 즉시 회수 되 지 않 고 느 린 단계 에서 회수 되 려 면 두 번 의 표 시 를 거 쳐 야 한다.
대상 이 접근 성 분석 에서 GC Root 와 의 인용 체인 이 없 으 면 이때 첫 번 째 로 표시 되 고 한 번 선별 되 며,선별 조건 은 finalize()방법 을 실행 할 필요 가 있 는 지 여부 다.대상 이 finalize()방법 을 덮어 쓰 지 않 았 거나 가상 컴퓨터 에 호출 되 었 을 때 필요 없다 고 생각 합 니 다.
이 대상 이 finalize()방법 을 실행 할 필요 가 있다 면 이 대상 은 F-Queue 라 는 대기 열 에 놓 여 있 습 니 다.가상 기 회 는 finalize()스 레 드 를 실행 합 니 다.이 스 레 드 는 낮은 우선 순위 이 고 가상 컴퓨터 는 실행 이 끝 날 때 까지 기다 리 겠 다 고 약속 하지 않 습 니 다.이것 은 finalize()의 실행 이 느 리 거나 잠 금 이 발생 하면그러면 F-Queue 대기 열 이 계속 기다 리 고 메모리 회수 시스템 이 무 너 질 수 있 습 니 다.GC 는 F-Queue 에 있 는 대상 을 두 번 째 로 표 시 했 는데,이때 해당 대상 은 제 거 돼 곧 회수 된다 는 집합 으로 회 수 를 기다린다.
메모리 분할 정책 및 의미
책략
자바 가상 머 신 은 메모리 더 미 를 신세대,노년 전과 영구 세대 로 구분 하 는데 영구 대 는 핫 스 팟 가상 머 신 특유 의 개념 으로 영구 세대 방식 으로 방법론 을 실현 한다.다른 가상 머 신 실현 은 이런 개념 이 없고 핫 스 팟 도 영구 대 를 취소 하 는 추세 이다.JDK 1.7 에서 핫 스 팟 은'영구 화'를 시작 했다.영구 대 에 놓 여 있 던 문자열 상수 탱크 를 옮 깁 니 다.영구 대 는 주로 상수,유형 정보,정태 변수 등 데 이 터 를 저장 하고(방법 구역 에 이식)쓰레기 회수 와 관계 가 크 지 않 으 며 신세대 와 옛날 은 쓰레기 회수 의 주요 지역 이다.
신세대(영)
새로 생 성 된 대상 은 신세대 에 우선 보관 되 며,신세대 대상 은 아침저녁 으로 죽 고 생존 율 이 낮 으 며,신세대 에 서 는 일반 애플 리 케 이 션 으로 쓰레기 수집-처럼 70~95%의 공간 을 회수 할 수 있어 회수 효율 이 높다.
구시 대(OldGenerationn)
신세대 에서 GC 를 여러 차례 겪 고도 살아 남 은 대상 은 노년기 에 접어 든다.옛날 에 대상 은 수명 주기 가 길 고 생존 율 이 높 았 으 며 옛날 에 GC 를 하 는 빈도 가 상대 적 으로 낮 았 고 회수 속도 도 느 렸 다.
영구 세대(Permanent Generation)
영구적 으로 저장 류 정보,상수,정적 변수,인 스 턴 트 컴 파일 러 가 컴 파일 한 코드 등 데 이 터 를 저장 합 니 다.이 지역 에 있어 자바 가상 컴퓨터 규범 은 쓰레기 수집 을 하지 않 아 도 되 고 일반적으로 쓰레기 수 거 를 하지 않 는 다 고 지적 합 니 다.
4.567917.Jdk 1.6 및 이전:영구 세대 가 있 고 상수 탱크 1.6 은 방법 구역 에 있 습 니 다4.567917.Jdk 1.7:영구 세대 가 있 지만 점차적으로'영구 세대 로 간다'.상수 탱크 는 1.7 더미 에 쌓 여 있다4.567917.Jdk 1.8 및 그 후:영구 세대 가 없고 상수 탱크 1.8 은 원 공간 에 있 습 니 다.한편,원 공간 은 메모리 에 직접 존재 하고 자바 가상 컴퓨터 에 없 기 때문에 원 공간 은 메모리 크기 에 의존 합 니 다.물론 원 공간 크기 도 사용자 정의 할 수 있 습 니 다의의
메모리 세대 가 생기 면 새로 생 성 된 대상 은 신세대 에 메모 리 를 분배 하고 여러 번 회수 한 후에 도 살아 남 은 대상 은 옛날 시대 에 저장 되 며 정적 속성,유형 정보 등 은 영구 세대 에 저장 되 고 신세대 의 대상 은 생존 시간 이 짧 으 며 신세대 지역 에서 GC 를 자주 진행 해 야 한다.옛날 에 대상 의 생명 주기 가 길 고 메모리 회수 빈도 가 상대 적 으로 낮다.자주 회수 할 필요 가 없고 영구 세대 에서 회수 효과 가 너무 떨 어 지 므 로 일반적으로 쓰레기 수 거 를 하지 않 으 며 서로 다른 연대 의 특징 에 따라 서로 다른 쓰레기 수집 알고리즘 을 사용 할 수 있다.세대 별 쓰레기 수집 은 쓰레기 수집 효율 을 크게 향상 시 켰 는데 이것 은 모두 JVM 세대 의 장점 이다.
쓰레기 회수 알고리즘
1.복제 알고리즘
복사 알고리즘 은 사용 가능 한 메모 리 를 용량 에 따라 같은 두 부분 으로 나 눈 다음 에 매번 그 중의 한 조각 만 사용 합 니 다.한 개의 메모리 가 다 떨 어 졌 을 때 살아 있 는 대상 을 두 번 째 메모리 에 복사 한 다음 에 첫 번 째 메모 리 를 한꺼번에 알 고 두 번 째 블록 에 있 는 대상 을 첫 번 째 블록 으로 복사 합 니 다.그러나 이런 방식 은 메모리 의 대가 가 너무 높 아 매번 기본적으로 메모리 의 절반 을 낭비해 야 한다.
2.태그 지우 기 알고리즘
JVM 쓰레기 수 거 알고리즘 중 가장 오래된 알고리즘 입 니 다.이 알고리즘 은 모두 두 단계 로 나 뉘 어 있 습 니 다.첫 번 째 단 계 는 참조 루트 노드 부터 모든 인 용 된 대상 을 표시 하고 두 번 째 단 계 는 전체 더 미 를 옮 겨 다 니 며 표시 되 지 않 은 대상 을 제거 합 니 다.이 알고리즘 은 전체 응용 을 중단 하고 회수 한 후에 사용 하지 않 은 공간 이 연속 되 지 않 는 다 는 단점 이 있 습 니 다.즉,메모리 조각 은 저장 에 영향 을 줄 수 있 습 니 다.
3.태그 정리 알고리즘
이 알고리즘 은 태그-명확 한 알고리즘 과 복제 알고리즘 의 장점 을 결합 하여 두 단계 로 나 뉜 다.첫 번 째 단 계 는 참조 루트 노드 부터 인 용 된 모든 대상 을 표시 하고 두 번 째 단 계 는 전체 더 미 를 옮 겨 다 니 며 생존 하지 않 는 대상 이 차지 하 는 공간 을 회수 한 후에 모든 생존 대상 을 왼쪽 빈 공간 으로 이동 시 키 고 해당 하 는 지침 을 업데이트 한다.태그-정리 알고리즘 은 태그-제거 알고리즘 을 바탕 으로 대상 의 이동 을 진행 하여 원가 가 더욱 높 지만 메모리 파편 문 제 를 해결 하고 순서대로 배출 하 며 복제 알고리즘 에 필요 한 메모리 공간 이 너무 큰 문 제 를 해결 하 였 습 니 다.
4.세대 별로 모 으 기
세대 별 수집 알고리즘 은 현재 대부분의 JVM 의 쓰레기 수집 기 에서 사용 되 는 알고리즘 이다.그것 의 핵심 사상 은 대상 이 생존 하 는 생명 주기 에 따라 메모 리 를 여러 개의 서로 다른 지역 으로 나 누 는 것 이다.일반적으로 퇴적 구역 을 옛날(Tenured Generation)과 신세대(Young Generation)로 나 누 는데 퇴적 구역 외 에 또 하나의 세대 가 영구 세대(Permanet Generation)다.오래된 시대 의 특징 은 쓰레기 를 수집 할 때마다 소량의 대상 만 회수 되 어야 한 다 는 것 이 었 고,신세대 의 특징 은 쓰레기 를 회수 할 때마다 대량의 대상 이 회수 되 어야 한 다 는 것 이 었 다.그러면 서로 다른 세대 의 특징 에 따라 가장 적합 한 수집 알고리즘 을 채택 할 수 있 었 다.
a.젊 은 세대 회수 알고리즘(핵심 은 복제 알고리즘)
HotSpot 는 신 생 대 를 3 개 로 나 누고-블록 이 큰 Eden 공간 과 2 개의 작은 Survivor 공간 으로 나 누 며 기본 비율 은 8:1:1 이다.구분 의 목적 은 핫 스 팟 이 복제 알고리즘 을 적용 해 신 생 대 를 회수 하고,이 비율 을 설정 한 것 은 메모리 공간 을 충분히 활용 해 낭 비 를 줄 이기 위 한 것 이다.새로 생 성 된 대상 은 Eden 구역 에서 분배(대상 을 제외 하고 대상 이 오래된 시대 에 직접 들 어 갑 니 다)되 며,Eden 구역 에 분배 할 공간 이 충분 하지 않 을 때 가상 머 신 은 Minor GC 를 시작 합 니 다.GC 가 시 작 될 때 대상 은 Eden 구역 과 From Survivor 구역 에 만 존재 하고 To Survivor 구역 은 비어 있 습 니 다(보존 구역 으로).
GC 가 진 행 될 때 Eden 구역 의 모든 생존 대상 은 To Survivor 구역 으로 복 사 됩 니 다.FromSurvivor 구역 에서 생존 대상 은 연령 에 따라 행방 을 결정 합 니 다.연령 이 밸브 값(기본 값 15,신세대 대상 은 쓰레기 회수 연령 을 견 딜 때마다 1,GC 세대 가 대상 의 header 에 저 장 됩 니 다)에 달 하 는 대상 은 옛날 로 옮 겨 집 니 다.밸브 값 에 도달 하지 않 은 대상 은 To Survivor 구역 으로 복 사 됩 니 다.
이 어 에덴 존 과 From Survivor 존 을 비 웠 고,신세대 중 살아 남 은 대상 은 모두 To Survivor 존 에 있 었 다.이 어 From Survivor 구역 과 To Survivor 구역 은 그들의 역할 을 교환 합 니 다.즉,새로운 To Survivor 구역 은 바로 지난번 GC 에서 비 운 FromSurvivor 구역 입 니 다.새로운 From Survivor 구역 은 바로.지난번 GC 의 To Survivor 구역 입 니 다.한 마디 로 하면 To Survivor 구역 이 GC 이후 에 비어 있 음 을 보증 합 니 다.(사실은 이것 이 세대 별 수집 알고리즘 중의 젊 은 세대 회수 알고리즘 입 니 다.이따가 보 겠 습 니 다.
GC 때 To Survivor 구역 에 지난번 신세대 가 수집 한 생존 대상 을 보관 할 공간 이 충분 하지 않 을 때 는 노후 에 의존 해 할당 보증 을 하고 이들 대상 을 노후 에 보관 해 야 한다.
b.옛날 회수 알고리즘(재 활용 은 주로 태그-정리 위주)
1)젊 은 세대 에서 쓰레기 수 거 N 회 를 거 쳐 살아 남 은 대상 은 노대 에 두 게 된다.따라서 연로 대 에 보 관 된 것 은 모두 수명 주기 가 긴 대상 이 라 고 볼 수 있다.
2)메모리 도 신세대 보다 훨씬 크다(대략 1:2).옛날 에 메모리 가 가득 찼 을 때 Major GC 즉 Full GC 를 촉발 하면 Full GC 의 발생 빈도 가 비교적 낮 고 옛날 대상 의 생존 시간 이 비교적 길 며 생존 율 표시 가 높다.
c.지구 대(Permanent Generation)의 회수 알고리즘
자바 류,방법 등 정적 파일 을 저장 하 는 데 사용 합 니 다.지구 대 는 쓰레기 회수 에 현저 한 영향 을 미 치지 않 지만 일부 응용 프로그램 은 동적 으로 생 성 되 거나 일부 class,예 를 들 어 Hibernate 등 을 호출 할 수 있 습 니 다.이 럴 때 이러한 운행 과정 에서 추 가 된 종 류 를 저장 하기 위해 비교적 큰 지구 대 공간 을 설정 해 야 합 니 다.이 지역 에 서 는 쓰레기 회수 가 거의 발생 하지 않 지만 GC 가 발생 하지 않 는 다 는 뜻 은 아니다.여기 서 진행 되 는 GC 는 주로 지구 대 에 있 는 상수 탱크 와 유형 에 대한 마 운 트 해제 이다.
조건:
1)이러한 종류의 모든 인 스 턴 스 는 회수 되 었 습 니 다.즉,자바 더미 에 이러한 인 스 턴 스 가 존재 하지 않 습 니 다.
2)이 클래스 를 불 러 온 ClassLoader 는 회수 되 었 습 니 다.
3)이 클래스 에 대응 하 는 java.lang.Class 대상 은 어디에서 도 인용 되 지 않 았 으 며,이 클래스 에 반사 적 으로 접근 할 수 없 는 방법 입 니 다.
가상 컴퓨터 는 상기 세 가지 조건 을 만족 시 키 는 무용 류 를 회수 할 수 있 습 니 다.여 기 는 대상 과 마찬가지 로 사용 하지 않 으 면 반드시 회수 할 수 있 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.