[JVM] 쓰레기 회수 알고리즘 총화
태그 - 제거 알고리즘 의 가장 기본 적 인 쓰레기 회수 알고리즘 은 말 그대로 전체 회수 과정 은 두 단계 로 나 뉜 다. 1. 하나씩 표시 2. 이 알고리즘 을 통일 적 으로 회수 하 는 것 은 나중에 모든 쓰레기 회수 알고리즘 의 초석 이 라 고 할 수 있다.여기 서 말 할 만 한 것 은 이 태그 가상 머 신 이 대상 이 '살 아 있 는' 것 인지 '죽 는' 것 인지 어떻게 판단 하 는 것 입 니까?따라서 두 가지 표기 알고리즘 을 도입 했다. 1. 인용 계수 알고리즘 은 계수 알고리즘 을 인용 하 는 것 이 매우 간단 하고 효율 적 이다. 한 대상 이 한 번 인용 되면 + 1 이 인용 되 지 않 으 면 - 1 이다. 계수 가 0 이면 사용 할 수 없 는 대상 이다. 그러나 이런 알고리즘 은 치 명 적 인 결함 이 존재 한다. 두 대상 이 서로 상대방 을 인용 하 는 것 은?따라서 이런 알고리즘 은 반드시 사용 할 수 없 을 것 이다. 패스 2. 가 달성 분석 알고리즘 은 현재 의 표기 알고리즘 주류 실현 은 모두 가 달성 분석 알고리즘 을 사용한다.바로 GC Roots 라 는 대상 을 기점 으로 인용 체인 을 통 해 아래로 검색 하 는 것 이다. 만약 에 한 대상 이 인용 체인 을 통 해 GC Roots 대상 과 연결 할 수 없다 면 회수 가능 대상 으로 간주 하고 위 에서 말 한 상호 인용 상황 도 자 연 스 럽 게 해결 된다.확장: 접근 성 분석 에서 도달 할 수 없 는 대상 이라도 죽지 않 으 면 안 되 는 것 이 아니 라 '집행유예' 에 잠시 처 할 뿐이다. 한 대상 의 사망 을 진정 으로 선고 하려 면 적어도 두 번 의 표기 과정 을 거 쳐 야 한다. 도달 할 수 없다 는 판정 을 받 은 후에 그 는 첫 번 째 표 시 를 받 고 선별 되 었 다. 만약 에 finalize () 방법 이나 finalize () 를 덮어 쓰 지 않 았 다 면방법 은 이미 가상 컴퓨터 에 호출 되 어 '방생' 되 었 으 며, finalize () 방법 을 실행 해 야 한 다 는 판정 을 받 으 면 F - Queue 라 는 대기 열 에 두 번 째 태그 대상 이 다시 인용 되면 방생 되 며, 그렇지 않 으 면 회수 된다.finalize () 방법 finalize () 는 Object 의 방법 입 니 다. 쓰레기 수 거 기 는 회수 대상 이 차지 하 는 메모 리 를 사용 하기 전에 호출 됩 니 다. 즉, 대상 이 가상 컴퓨터 에 의 해 사망 선 고 를 받 았 을 때 finalize () 방법 을 사용 하여 생전 의 마지막 일 을 처리 하도록 합 니 다. (이 대상 은 이 시 기 를 틈 타 죽음 에서 벗 어 날 수 있 습 니 다)
여기 서 날 카 로 운 동료 들 이 알 아 차 렸 을 수도 있 습 니 다. 위 에서 인용 이 라 고 말 하기 때문에 인용 의 정 의 는 특히 관건 적 입 니 다. JDK 1.2 이후 자바 는 인용 개념 을 확대 하고 인용 을 강 한 인용, 부 드 러 운 인용, 약 한 인용, 허 인용 네 가지 로 나 누 었 습 니 다.
: , GC
: ,
: ,GC ,
: , GC
복사 알고리즘 앞에서 말 한 태그 - 제거 알고리즘 은 사실 두 과정 모두 효율 이 낮 고 회수 한 후에 메모리 가 '구멍 을 많이 파 낸다' 는 메모리 파편 화가 심각 합 니 다. 이때 비교적 큰 대상 이 오 면 전체 연속 적 인 메모리 공간 을 찾 지 못 하면 다른 GC 회 수 를 미리 촉발 해 야 합 니 다.복사 알고리즘 은 메모리 하 나 를 2 로 나 누 어 매번 절반 만 사용 하고 가득 찬 후에 살아 남 은 대상 을 다른 깨끗 한 메모리 에 가지런 하 게 복사 하여 남 은 조각 을 한꺼번에 지우 고 간단 하고 효율 적 입 니 다.그러나 사용 가능 한 메모리 가 원래 의 절반 으로 바 뀌 었 다 는 큰 결함 도 있다.
세대 별 수집 알고리즘 은 사실 IBM 회사 가 연 구 를 통 해 98% 의 대상 이 모두 '조생석사' 이기 때문에 1: 1 의 메모리 구분 이 필요 하지 않 습 니 다. 즉, 우리 가 현재 자주 사용 하 는 세대 별 수집 알고리즘 은 대상 의 생존 주기 에 따라 메모리 를 두 조각 으로 나 누 었 습 니 다. 각각 신세대 와 옛날 로 나 눈 다음 에 각 세대 에 대해 서로 다른 회수 알고리즘 을 사용 합 니 다.신생대 에 서 는 대부분 '조 생석 사' 의 대상 으로 신생대 8: 2 를 에덴 구 와 survival 구 로 나 누 었 다. 그 중에서 survival 구 1: 1 은 s0 과 s1 두 조각 으로 나 누 어 앞서 말 한 복제 알고리즘 을 사용 하여 메모리 파편 의 발생 을 감소 시 켰 다.신세대 가 만 료 되면 minor GC, minor GC 가 생존 하 는 대상 을 survival 구역 으로 옮 기 고 survival 구역 이 만 료 되면 survival 구역 을 회수 하 며 생존 하 는 survival 구역 의 대상 을 다른 survival 구역 으로 복사 하고 survival 구역 의 대상 은 한 번 생존 하 는 연령 + 1 이 일정한 연령 에 이 르 면 옛날 로 간다.
확장 01: JVM 전역 GC 는 언제 진 행 됩 니까?
01. System.GC
02.
03.
04.
확장 02: 압력 테스트 에서 FullGC 주파수 가 높 은 것 을 발 견 했 습 니 다. 어떻게 해결 합 니까?
01. GC , ,
02. JVM , 、 S0+S1 ,
03.Dump ,
04. , ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.