[중요] 삼색 표기 법 과 쓰레기 수 거기 (CMS, G1)

삼색 표기 법 - 알고리즘 사상
삼색 표기 법 은 대상 의 색깔 을 검은색, 회색, 흰색, 세 가지 색깔 로 나눈다.
  • 검은색: 이 대상 은 이미 표시 되 었 고 이 대상 의 속성 도 모두 표시 되 었 습 니 다.(프로그램 에 필요 한 대상)
  • 회색: 이 대상 은 이미 표시 되 었 지만 이 대상 의 속성 은 모두 표시 되 지 않 았 습 니 다.(GC 는 이 대상 에서 쓰레기 를 찾 아야 한다)
  • 흰색: 이 대상 은 표 시 된 적 이 없습니다.(대상 쓰레기)
  • 알고리즘 흐름:
  • 우리 main 방법의 뿌리 대상 (JVM 에서 GC Root 부터 그들의 대상 을 따라 아래로 찾 아 검 고 회백색 의 규칙 으로 GC Root 과 연 결 된 모든 대상
  • 을 표시 합 니 다.
  • 스 캔 한 번 이 끝나 면 보통 한 번 의 짧 은 STW (Stop The World) 를 거 쳐 다시 스 캔 해 야 하 는데 이때 검은색 대상 의 속성 도 이미 표시 되 었 기 때문에 회색 대상 을 찾 아 계속 아래로 표시 하면 된다.(또한 대부분의 태그 작업 은 이미 첫 번 째 동시 다발 때 발생 했 기 때문에 회색 대상 의 수량 이 적 고 표시 시간 도 매우 짧다)
  • 이 때 프로그램 이 계속 실 행 됩 니 다. GC 스 레 드 는 모든 메모 리 를 스 캔 하여 흰색 으로 표 시 된 대상 (쓰레기) 을 찾 아 제거 합 니 다
  • 질문 이 있 습 니 다:
    1. 유동 쓰레기: 동시에 표 시 를 하 는 과정 에서 검은색 이나 회색 으로 표 시 된 대상 이 갑자기 쓰레기 가 된다 면 이 대상 은 흰색 이 아니면 제거 되 지 않 고 다시 표시 해도 안 된다 GC Root.에서 찾 을 수 있 기 때문에 유동 쓰레기 가 되 었 습 니 다. 이러한 상황 은 시스템 에 미 치 는 영향 이 크 지 않 습 니 다. 다음 GC 에 남 겨 두 고 처리 하면 됩 니 다. 2. 대상 누 출 문제 (필요 한 대상 을 회수 합 니 다): 동시에 표 시 를 하 는 과정 에서 한 업무 스 레 드 는 스 캔 되 지 않 은 흰색 대상 을 차단 하여 쓰레기 로 만 들 었 습 니 다 (인용 삭제). 또한 검은색 대상 은 이 대상 을 인용 하 였 습 니 다.(인용 추가) (이 두 부분 은 선후 순 서 를 가리 지 않 아 도 된다) 검은색 대상 의 의 미 는 그 속성 이 모두 표시 되 었 기 때문에 다시 표시 해도 검은색 대상 에서 찾 지 않 고 프로그램 에 필요 한 대상 이 GC 에 회수 되 어야 한다. 이 문 제 는 시스템 에 문제 가 생 길 수 있다. CMSG1, 두 가지 재 활용 기 는 3 색 표기 법 을 사용 할 때 이러한 문제 에 대응 하 는 조 치 를 취 했다. = CMS 는 인용 절 차 를 추가 처리 (Incrediment Update) 하고, G1 는 인용 절 차 를 삭제 하 는 것 을 처리 (SATB) 한다. = =
    삼색 표기 법의 실천 과 대응 대상 의 누락 문제 에 대한 구체 적 인 방법
    JVM 가상 머 신 에서 흔히 볼 수 있 는 쓰레기 수 거 기 는 두 가지 알고리즘 을 사 용 했 습 니 다.
    1、 CMS(Concurrent Mark Sweep) 2、 G1(Garbage First)
    CMS(Concurrent Mark Sweep)
    CMS 는 매우 유명한 JVM 쓰레기 수 거 기로 서 상하 의 역할 을 하 며 동시 회수 의 장 을 열 었 다.
    하지만 CMS 는 사소한 문제 들 로 거의 탈락 했다.
    증분 업데이트 (증분 업데이트)
    누락 문제 에 대응 할 때 CMS 는 Increment Update 방법 을 사용 했다.
    표시 되 지 않 은 대상 (흰색 대상) 이 다시 인 용 된 후 = = 참조 대상 = = 검은색 이면 회색 으로 변 하고 다음 두 번 표시 시 GC 스 레 드 에 속성 대상 을 계속 표시 합 니 다.
    그러나 그 럴 때 에 도 표지 가 새 는 문제 가 존재 한다.
  • 회색 대상 이 GC 스 레 드 로 회수 되 고 있 을 때 표 시 된 속성 이 흰색 대상 (쓰레기)
  • 을 가리 키 고 있 습 니 다.
  • 이 대상 의 속성 대상 자체 가 모두 표시 되 지 않 으 면 회색 으로 변 하지 않 습 니 다
  • 이 GC 스 레 드 는 마지막 속성 을 표시 한 후에 모든 속성 표 시 를 끝 냈 다 고 생각 합 니 다. 이 회색 대상 을 검은색 으로 표시 하고 다시 인 용 된 흰색 대상 은 표시 할 수 없습니다
  • 덧 붙 여 CMS 는 이 결함 을 제외 하고 두 가지 치 명 적 인 결함 이 존재 한다.
    1. CMS 는 Mark-Sweep 알고리즘 을 사용 하여 마지막 에 많은 메모리 조각 이 생 길 수 있 습 니 다. 일정한 수량 이 되면 CMS 는 이 조각 들 을 청소 할 수 없습니다. CMS 는 Serial Old 로 하여 금 이 쓰레기 조각 들 을 청소 하 게 합 니 다. Serial Old 는 단일 스 레 드 작업 으로 쓰레기 를 청소 하 는 것 으로 효율 이 낮은 편 입 니 다.
        CMS        ,     ,      ,         `Serial Old GC` ,    。
    
     *      :  `Mark-Sweep-Compact`  ,      
     *      (    ):
            -XX:+UseCMSCompactAtFullCollection    CMS   
            -XX:CMSFullGCsBeforeCompaction    0,      CMS FullGC     
    

    2. JVM 이 메모리 가 부족 하 다 고 판단 한 다음 에 CMS 를 사용 하여 동시에 메모 리 를 정리 하면 OOM 문제 가 발생 할 수 있 으 므 로 어 쩔 수 없 이 Serial Old GC 해 야 합 니 다. Serial Old 는 단일 스 레 드 쓰레기 회수 로 효율 이 낮 습 니 다.
     *      :    `CMS GC`   ,               
     *      :
            -XX:CMSInitiatingOccupancyFraction 92%        ,              CMS GC
    

    G1(Garbage First)
    G1 쓰레기 수 거 기 를 시작 으로 G1 의 물리 적 메모 리 는 세대 구분 없 이 한 조각 한 조각 Region 으로 구성 되 며, 논리 적 세대 구분 은 여전히 존재 한다.
    선행 지식 - 카드 테이블 (다양한 쓰레기 수 거 기 를 갖 추고 있 음)
  • 진행 YoungGC 할 때 우 리 는 한 대상 이 인용 되 는 지 여 부 를 진행 하 는 과정 에서 Old 구역 전 체 를 스 캔 해 야 하기 때문에 JVM 은 Old 를 하나의 카드 로 구분 하고 한 카드 에 여러 개의 대상 이 있 으 며, 한 카드 에 인용 이 Young 구역 을 가리 키 는 경우 CardTable 로 표시 하고 다음 에 진행 Dirty Card 해 야 한다.시, 스 캔 YoungGC 만 하면 됩 니 다.
  • Card Table 은 바 텀 데이터 구조 에서  Dirty Card 실현.
  • CSet(Collection Set)
    회수 가능 한 파 티 션 Region 의 집합, Region 은 여러 대상 의 집합 메모리 영역 입 니 다.
    RSet(Remembered Set)
    각각 Bit Map 중 하나 Region 가 있 고 다른 RSet 에서 본 Region 까지 의 인용 정 보 를 기록 합 니 다. 쓰레기 수 거 기 는 전체 더 미 를 스 캔 하지 않 고 누가 현재 파 티 션 의 대상 을 인용 하 는 지 찾 을 수 있 습 니 다. RSet 만 스 캔 하면 됩 니 다.
    신세대 와 노년의 비율.Region, 일반적으로 수 동 지정 을 사용 하지 않 는데, 이 는 G1 이 정지 시간 을 예측 하 는 기준 이기 때문이다.
    SATB(Snapshot At The Beginning)
    누락 문제 에 대응 할 때 CMS 는 5% - 60% 방법 을 사용 했다.
    1. 표 시 를 시작 할 때 스냅 샷 아이콘 의 생존 대상 을 생 성 합 니 다. 2. 인용 이 끊 긴 후에 이 인용 을 GC 의 스 택 에 밀어 서 흰색 대상 (쓰레기) 이 GC 스 레 드 에 의 해 3, 배합 SATB 으로 스 캔 되 고 어떤 Region 이 현재 의 흰색 대상 에 인용 되 는 지 스 캔 합 니 다. 현재 대상 에 인용 되 지 않 으 면 회수 합 니 다.
    SATB 효율 이 Increment update 보다 높 은 이 유 는?
  • SATB 가 재 표시 부분 에서 스 택 에 밀 려 있 는 인용 을 다시 스 캔 하고 Rset 에 맞 춰 현재 대상 이 인용 되 었 는 지 여 부 를 판단 하여 회수 해 야 하기 때 문 입 니 다.
  • 그리고 마지막 Rset 에 모든 쓰레기 를 회수 하 는 대상 을 선택 하지 않 고 G1 의 쓰레기 가 얼마나 되 는 지 에 따라 회수 가 치 를 판단 하고 예측 하 며 (회수 한 쓰레기 와 회수 한 Region 시간의 예측 치) 하나 이상 STWRegion 에 넣 고 마지막 으로 이들 CSet 중의 생존 대상 을 압축 하여 새로운 것 으로 복사 한다.Region 중 원래 의 것 을 비 워 라 Region.
  • 질문: G1 풀 GC 진행 되 나 요?
    메모리 가 가득 찼 을 때 Region 진행 되 고 Full GC 이전 JDK10 은 단일 스 레 드 이기 때문에 G1 을 사용 하려 면 Full GC 의 발생 을 피해 야 합 니 다.
    해결 방안:
  • 메모리 증가;
  • CPU 성능 을 향상 시 키 고 GC 회수 속 도 를 가속 화 하 며 대상 증가 속도 가 회수 속 도 를 따라 가지 못 하면 Full GC 는 피 할 수 있다.
  • Mixed GC 트리거 를 하 는 한도 값 을 낮 추고 Mixed GC 를 앞 당 겨 발생 시 킵 니 다 (기본 45%)
  • 문장 영구 링크:https://tech.souyunku.com/?p=45733

    좋은 웹페이지 즐겨찾기