처리량: 프로세서가 사용자 코드를 실행하는 데 소비한 시간과 소비된 총 프로세서 시간의 비율입니다.
높은 처리량은 프로세서 리소스를 가장 효율적으로 사용하고 프로그램의 컴퓨팅 작업을 최대한 빨리 완료할 수 있으며 주로 백그라운드에서 작동하고 상호 작용이 많이 필요하지 않은 분석 작업에 적합합니다.
Parallel Old는 Parallel Scavenge 수집기의 이전 세대 버전으로, 다중 스레드 동시 수집을 지원하고 마크 대조 알고리즘을 기반으로 구현됩니다.
CMS Collector
CMS(Concurrent Mark Sweep) Collector는 가장 짧은 재활용 휴지 시간을 얻는 것을 목표로 하는 Collector입니다.
CMS 수집기는 mark-clear 알고리즘을 기반으로 구현됩니다. 해당 작업은 다음을 포함하여 4가지 단계로 나눌 수 있습니다.
- 초기 표시
초기 표시는 GC Roots가 직접 연결할 수 있는 개체만 표시합니다. fast;
- 동시 마킹
동시 마킹 단계는 GC Roots의 직접 연관된 개체부터 시작하여 전체 개체 그래프를 순회하는 프로세스입니다. 이 프로세스는 시간이 오래 걸리지만 사용자 스레드를 중지할 필요가 없으며 다음과 동시에 실행할 수 있습니다. - Re-marking
Re-marking 단계는 동시 마킹 중 사용자 프로그램의 지속적인 동작으로 인해 변경된 객체의 해당 부분에 대한 마킹 기록을 수정하는 단계입니다. 일반적으로 초기 마킹 단계보다 약간 길지만 동시 마킹 단계보다 훨씬 짧습니다.
- Concurrent Clearing
마킹 단계에서 판단된 죽은 개체를 정리하고 삭제합니다. 살아남은 개체를 이동할 필요가 없습니다. , 이 단계는 사용자 스레드와 동시에 진행될 수도 있습니다.
CMS 수집기는 "Floating Garbage"를 처리할 수 없으며 "동시 모드 실패"가 실패하여 또 다른 "Stop The World" Full GC가 발생할 수 있습니다.
CMS의 동시 마킹 및 동시 클리닝 단계에서는 사용자 스레드가 계속 실행 중입니다. 프로그램이 실행되는 동안 자연스럽게 새로운 가비지 개체가 생성되지만, 가비지 개체의 이 부분은 마킹 프로세스가 완료된 후에 나타날 수 없습니다. 현재 컬렉션에서 폐기되고 다음 가비지 컬렉션에서 정리되어야 합니다. 이 쓰레기 부분을 '부유쓰레기'라고 합니다.
가비지 수집 단계에서도 사용자 스레드가 계속 실행되어야 하기 때문에 사용자 스레드가 사용할 충분한 메모리 공간을 예약해야 하므로 CMS 수집기는 이전 세대가 다른 세대처럼 거의 완전히 채워질 때까지 기다릴 수 없습니다. 다시 수집하기 위해서는 동시 수집 시 프로그램 동작을 위해 일부 공간을 확보해야 합니다.
CMS는 "mark-and-clear" 알고리즘을 기반으로 구현된 컬렉터입니다. 즉, 컬렉션이 끝나면 대량의 공간 조각이 생성됩니다. 큰 개체 할당에 문제가 있습니다.
조각화를 방지하기 위해 태그 압축 알고리즘을 사용하는 것은 어떨까요?
동시 삭제 시 mark-compression을 사용하여 메모리를 정리하면 원래 사용자 스레드에서 사용하는 메모리를 사용할 수 없기 때문입니다. 사용자 스레드가 계속 실행되도록 하려면 스레드가 실행되는 리소스가 영향을 받지 않아야 한다는 것이 전제입니다. 플래그 압축은 "Stop The World" 시나리오에 더 적합합니다.
G1(Garbage First) 컬렉터
Garbage First는 지역 수집을 위한 컬렉터의 디자인 아이디어와 Region 기반의 메모리 레이아웃 형태를 개척한 주로 서버사이드 애플리케이션, 주로 멀티-사이드 애플리케이션을 위한 가비지 컬렉터입니다. CPU와 대용량 메모리를 갖춘 머신은 매우 높은 확률로 GC 일시정지 시간을 충족할 수 있으며 처리량 성능 특성도 높습니다.
G1 컬렉터 이전의 다른 모든 컬렉터의 경우 가비지 컬렉션 대상 범위는 전체 신세대, 전체 구세대 또는 전체 Java 힙이었습니다. G1은 재활용을 위해 힙 메모리의 모든 부분에 대한 컬렉션 세트를 구성할 수 있습니다. 측정 기준은 더 이상 해당 메모리가 속한 세대가 아니라 가장 많은 양의 가비지를 저장하고 가장 큰 재활용 이점을 갖는 메모리 조각입니다. G1 컬렉터의 특징
1. 병렬성과 동시성
병렬성: G1 재활용 중에 여러 GC 스레드가 동시에 작동할 수 있으며 이때 사용자 스레드는 세상을 중지합니다.
- 동시성: G1에는 애플리케이션과 교대로 실행할 수 있는 기능이 있으며 작업의 일부가 애플리케이션과 동시에 실행될 수 있습니다. 따라서 일반적으로 전체 재활용 단계에서 애플리케이션이 완전히 차단되지는 않습니다.
-
2. 세대별 컬렉션
- G1은 여전히 세대별 컬렉션 이론에 따라 설계되었지만 힙 메모리 레이아웃은 다른 컬렉터와 매우 명백하게 다릅니다. G1은 더 이상 고정된 크기와 고정된 수의 세대별 영역 분할을 고집하지 않지만 연속 Java 힙은 분할됩니다. 각 지역은 필요에 따라 에덴 공간, 생존자 공간 또는 신세대의 구세대 공간 역할을 할 수 있습니다. 수집가는 다양한 전략을 사용하여 다양한 역할을 수행하는 영역을 처리할 수 있으므로 새로 생성된 개체와 일정 기간 동안 살아남고 여러 컬렉션에서 살아남은 오래된 개체 모두 좋은 컬렉션 결과를 얻을 수 있습니다.
- 지역에는 특히 대형 물체를 보관하는 데 사용되는 특별한 유형의 Humongous 지역이 있습니다. G1은 객체의 크기가 지역 용량의 절반을 초과하는 한 대형 객체로 판단할 수 있다고 믿습니다.
3. 공간 통합
- G1은 메모리 재활용 시 영역을 기본 단위로 사용하며, 영역 간 복사 알고리즘을 사용하지만 전체적으로는 마크 압축 알고리즘이라고 볼 수 있습니다.
4. 예측 가능한 일시 정지 시간 모델
- G1 수집기는 단일 재활용의 최소 단위로 Region을 사용합니다. 즉, 매번 수집되는 메모리 공간은 Region An입니다. 전체 Java 힙의 전체 영역 가비지 수집을 계획된 방식으로 피할 수 있도록 크기의 정수 배수입니다.
- G1 수집기는 각 지역의 쓰레기 축적량의 "가치"를 추적합니다. 가치는 재활용을 위해 획득한 공간의 양과 재활용에 필요한 시간의 경험치를 바탕으로 백그라운드에서 우선순위 목록을 유지합니다. , 매번 사용자는 허용되는 수집 일시 중지 시간을 설정하고 복구 값이 가장 큰 지역의 우선 순위를 지정합니다.
- 이 지역을 사용하여 메모리 공간을 분할하고 지역 재활용을 우선시하는 이 방법은 G1 수집기가 제한된 시간 내에 가능한 최고의 수집 효율성을 얻을 수 있도록 보장합니다.
- 일시 중지 예측 모델은 감쇠 평균의 이론적 기반을 바탕으로 구현됩니다. 가비지 수집 프로세스 중에 G1 수집기는 각 지역의 복구 시간, 각 지역의 메모리 세트에 있는 더티 카드 수 및 기타 측정 가능한 매개변수를 기록합니다. 단계의 비용을 분석하고 평균, 표준편차, 신뢰수준 등의 통계정보를 얻습니다. 그런 다음 이 정보를 사용하여 지금 재활용이 시작되면 예상되는 일시 중지 시간을 초과하지 않고 가장 높은 수익을 얻을 수 있도록 재활용 수거를 구성할 지역을 예측합니다.
Region에 존재하는 Cross-Region 참조 객체를 어떻게 해결하나요?
전체 힙을 GC 루트로 스캔하지 않으려면 메모리 세트를 사용하세요. 각 지역은 자체 메모리 세트를 유지하며 다른 지역이 가리키는 포인터를 기록하고 해당 포인터의 카드 페이지 범위를 표시합니다. G1의 메모리 세트는 본질적으로 저장 구조 측면에서 해시 테이블입니다. Key는 다른 Region의 시작 주소이고 Value는 세트이며 여기에 저장되는 요소는 카드 테이블의 인덱스 번호입니다.
G1 컬렉터의 동작 과정
-
Initial Marking(Initial Marking): GC Roots가 직접 연관될 수 있는 객체만 표시하고, 다음 단계의 사용자 스레드를 허용하도록 TAMS 포인터 값을 수정하면 됩니다. 동시에 실행할 수 있습니다. 사용 가능한 리전에서 새 개체를 올바르게 할당할 수 있습니다. 이 단계에서는 스레드를 일시정지해야 하지만 시간이 매우 짧고 Minor GC 중에 동기적으로 완료되므로 G1 콜렉터는 실제로 이 단계에서 추가 일시정지를 갖지 않습니다.
-
Concurrent Marking(동시 마킹): GC Root부터 시작하여 힙에 있는 객체에 대한 도달성 분석을 수행하고, 전체 힙에 있는 객체 그래프를 재귀적으로 스캔하여 재활용할 객체를 찾는 단계입니다. 시간이 오래 걸리지만 사용자 프로그램과 동시에 실행될 수 있습니다. 개체 그래프 스캔이 완료된 후 동시성 중에 참조 변경이 있는 SATB에 의해 기록된 개체를 다시 처리해야 합니다.
-
Final Marking(최종 표시): 동시 단계 이후 남은 마지막 몇 개의 SATB 레코드를 처리하기 위해 사용자 스레드를 잠시 일시 중지합니다.
-
스크리닝 및 재활용(실시간 데이터 계산 및 대피): 지역 통계 업데이트, 각 지역의 재활용 가치 및 비용 정렬, 사용자가 예상하는 일시 중지 시간을 기준으로 재활용 계획 수립을 담당합니다. Region은 재활용 컬렉션을 구성한 후 재활용하기로 결정된 Region의 일부 객체를 빈 Region에 복사한 다음 전체 이전 Region의 공간을 정리합니다. 여기서 작업에는 사용자 스레드를 일시 중단하고 여러 수집기 스레드를 병렬로 완료해야 하는 살아있는 객체의 이동이 포함됩니다.
7가지 클래식 가비지 컬렉터 비교
가비지 컬렉터 조합
낮은 대기 시간 가비지 수집기
Shenandoah 수집기
Shenandoah는 또한 지역 기반 힙 메모리 레이아웃을 사용합니다. 또한 대형 개체를 저장하기 위한 거대한 지역도 있습니다. 기본 재활용 전략도 재활용 가치가 가장 높은 지역을 우선시합니다. 힙 메모리 관리 측면에서 G1과 적어도 세 가지 분명한 차이점이 있습니다.
- G1의 재활용 단계는 여러 스레드로 병렬화될 수 있지만, 사용자 스레드와 동시에 수행될 수는 없습니다. Shenandoah는 동시 정렬 알고리즘을 지원합니다.
- 세대별 컬렉션은 기본적으로 사용되지 않습니다. 즉, 세대별 컬렉션이 구현되지 않는다는 의미는 아닙니다. 비용 효율성. 워크로드 고려사항에 따라 낮은 우선순위로 배치합니다.
- Shenandoah는 G1에서 유지 관리하기 위해 많은 메모리와 컴퓨팅 리소스를 소비하는 메모리 세트를 버리고 대신 "연결 매트릭스"라는 전역 데이터 구조를 사용하여 교차 지역 참조 관계를 기록함으로써 교차 지역을 처리할 때 메모리 세트를 줄였습니다. 생성 포인터를 사용하면 의사 공유 문제가 발생할 가능성도 줄어듭니다. 연결 행렬은 단순히 2차원 테이블로 이해될 수 있습니다. 영역 N에 영역 M을 가리키는 객체가 있으면 재활용 중에 테이블의 N 행과 M 열에 표시가 배치됩니다. 교차 연결이 있는 지역을 결정하는 데 사용됩니다.
Shenandoah Collector의 작업 과정은 대략 다음과 같은 9단계로 나눌 수 있습니다.
-
초기 마킹: G1과 마찬가지로 GC Roots와 직접 관련된 개체가 먼저 표시됩니다. 이 단계는 여전히 "Stop The World"입니다. , 그러나 일시 중지 시간은 힙 크기와 관련이 없으며 GC 루트 수만 관련됩니다.
-
동시 표시: G1과 마찬가지로 객체 그래프를 탐색하고 도달 가능한 모든 객체를 표시합니다. 이 단계는 사용자 스레드와 동시에 수행됩니다. 시간은 힙에 남아 있는 객체 수와 객체의 구조적 복잡성에 따라 다릅니다. 그래프.
-
최종 표시: G1과 동일하며 나머지 SATB 스캔을 처리하고 이 단계에서 재활용 가치가 가장 높은 지역을 계산하고 이러한 지역을 일련의 재활용 컬렉션으로 구성합니다. 최종 채점 단계에서도 짧은 휴식 시간이 있을 것입니다.
-
동시 정리: 이 단계는 전체 지역에서 단 하나의 생존 개체도 발견되지 않은 지역을 정리하는 데 사용됩니다.
-
동시 재활용: 이 단계에서 Shenandoah는 컬렉션에서 살아남은 개체를 사용되지 않은 다른 지역에 복사합니다. 동시 수집 단계가 실행되는 기간은 수집 크기에 따라 다릅니다.
-
초기 참조 업데이트: 동시 재활용 단계에서 개체가 복사된 후 힙에 있는 이전 개체에 대한 모든 참조를 복사 후 새 주소로 수정해야 합니다. 이 작업을 참조 업데이트라고 합니다. 참조 업데이트의 초기화 단계는 실제로 특정 처리를 수행하지 않습니다. 이 단계는 동시 재활용 단계의 모든 수집기 스레드가 할당된 개체 이동 작업을 완료했는지 확인하기 위해 스레드 랑데부 지점을 설정하기 위해서만 설정됩니다. 초기 참조 업데이트 시간이 매우 짧아서 매우 짧은 일시 중지가 발생합니다.
-
동시 참조 업데이트: 참조 업데이트 작업이 실제로 시작됩니다. 이 단계는 사용자 스레드와 동시에 수행됩니다. 시간은 메모리에 포함된 참조 수에 따라 다릅니다. 동시 참조 업데이트는 동시 마킹과 다릅니다. 더 이상 객체 그래프를 따라 검색할 필요가 없으며 메모리 물리적 주소 순서대로 참조 유형을 선형적으로 검색하고 이전 값을 새 값으로 변경하기만 하면 됩니다.
-
최종 참조 업데이트: 힙의 참조 업데이트를 해결한 후 GC Roots에 존재하는 참조도 수정해야 합니다. 이 단계는 Shenandoah의 마지막 Pause이며 Pause 시간은 GC Roots의 수에만 관련됩니다.
-
동시 정리: 동시 재활용 및 참조 업데이트 후 전체 재활용 세트의 모든 영역에는 더 이상 살아있는 객체가 없으며 이러한 영역은 즉시 쓰레기 영역이 됩니다. 마지막으로 동시 청소 프로세스가 다시 호출되어 메모리를 회수합니다. 향후 새 객체 할당을 위한 공간입니다.
ZGC Collector
ZGC와 Shenandoah의 목표는 매우 유사합니다. 둘 다 처리량에 영향을 주지 않고 힙 메모리 크기에서 가비지 수집 일시 중지 시간을 최대한 제한하는 것을 목표로 합니다. 대기 시간은 10밀리초 이내입니다.
ZGC 수집기는 생성 없이 (일시적으로) 영역 메모리 레이아웃을 기반으로 하며 읽기 장벽, 염색 포인터 및 메모리 다중 매핑과 같은 기술을 사용하여 지연 시간이 저렴한 가비지 수집기입니다. 주요 목표로 삼았습니다.
ZGC도 지역 기반 힙 메모리 레이아웃을 사용하지만, 이와 달리 ZGC의 지역은 동적입니다. 동적 생성 및 파괴는 물론 동적 지역 용량 크기도 있습니다.
ZGC의 운영 과정은 4단계로 나눌 수 있습니다:
-
Concurrent Marking(: G1, Shenandoah와 마찬가지로 동시 마킹도 도달성 분석을 위해 객체 그래프를 순회하는 단계입니다. 또한 G1, Shenandoah와 유사하게 초기 마킹과 최종 마킹을 거칩니다(ZGC에서는 이름이 다릅니다). 이를 짧은 일시 중지라고 하며 이러한 일시 중지 단계에서 수행되는 작업은 대상에서 유사합니다. G1 및 Shenandoah와 달리 ZGC의 표시는 개체 대신 포인터에서 수행되며 표시 단계는 업데이트됩니다. 염색 포인터에 표시된 1개의 플래그
-
재할당 동시 준비: 이 단계에서는 특정 쿼리 조건을 기반으로 이 수집 프로세스에서 정리할 지역을 계산하고 이러한 지역을 재할당 세트
- 로 구성해야 합니다. 동시 재할당: 재할당은 ZGC 실행 프로세스의 핵심 단계입니다. 이 프로세스에는 재할당 세트에서 살아남은 개체를 새 지역으로 복사하고 이전 개체의 조정 관계에서 각 지역에 대한 전달 테이블과 레코드를 유지하는 작업이 포함됩니다.
- 동시 재매핑: 재매핑은 재할당 세트의 이전 객체를 가리키는 전체 힙의 모든 참조를 수정하는 것입니다. 이 작업은 동시 재매핑 단계에서 수행됩니다. 다음 가비지 수집 주기의 동시 표시 단계 어쨌든 모든 개체를 순회해야 하므로 모든 포인터가 수정되면 병합을 통해 이전 개체 관계의 전달 테이블을 해제할 수 있어 개체 그래프를 순회하는 비용이 절약됩니다.
적합한 가비지 수집기를 선택하세요다음 세 가지 질문을 고려하세요. 애플리케이션의 주요 초점은 무엇인가요?
데이터 분석 또는 과학 컴퓨팅인 경우 이와 같은 작업의 목표는 결과를 계산하는 것입니다. - SLA 애플리케이션의 경우 일시 중지 시간이 서비스 품질에 직접적인 영향을 미치며, 심한 경우 트랜잭션 시간 초과가 발생할 수도 있으므로 지연이 주요 초점입니다.
- 클라이언트 애플리케이션이거나 임베디드 애플리케이션인 경우 가비지 수집의 메모리 사용량을 무시할 수 없습니다.
- 애플리케이션을 실행하기 위한 인프라는 무엇입니까?
관련 시스템 아키텍처는 x86-32/64입니다. ARM/Aarch64;
- 프로세서 수 및 할당된 메모리 크기
- 선택한 운영 체제가 Linux, Solaris 또는 Windows 등인지 여부
- JDK의 버전 번호는 무엇입니까? ZingJDK/Zulu, OracleJDK, Open-JDK 또는 다른 회사의 배포판은 무엇입니까? 이 JDK는 어떤 버전의 "Java Virtual Machine 사양"에 해당합니까?
힙을 먼저 조정하려면 가비지 수집기를 선택하는 방법
? 메모리가 100M 미만이면 직렬 수집기를 사용하세요단일 코어, 독립 실행형 프로그램이고 일시 중지 시간 요구 사항이 없으면 직렬 수집기를 사용하세요
- 다중 CPU인 경우 높은 수준이 필요합니다 처리량, 일시 중지 시간이 1초를 초과하도록 허용, 병렬 또는 JVM 선택
- CPU가 여러 개 있고 낮은 일시 중지 시간을 추구하고 신속하게 응답해야 하는 경우(예: 인터넷 응용 프로그램의 경우 지연이 1초를 초과할 수 없음) 동시 수집기
- 추천 학습: "
- java 비디오 튜토리얼
"-