Java JVM: 가비지 수집기 및 메모리 할당 전략(2)

  다양한 메모리 오버플로 및 메모리 누수 문제를 해결해야 하고 가비지 수집이 더 높은 동시성을 달성하기 위해 시스템의 병목 현상이 되는 경우 이를 모니터링하고 조정해야 합니다.

1. 주체가 죽었다

  • 참조 카운팅 알고리즘: 참조가 있으면 카운터가 1 증가하고 참조가 유효하지 않으면 카운터가 1 감소하며 상호 참조는 재활용할 수 없습니다.

  • 접근성 분석

    • GC Roots의 루트 객체는 시작 노드 집합으로 사용되며 검색 프로세스가 이동하는 경로를 "참조 체인"이라고 합니다.
    • 개체와 GC Roots 사이에 참조 링크가 없고 개체에 도달할 수 없는 경우 개체를 더 이상 사용할 수 없음을 증명합니다.
    • GC 루트 객체
      • 가상 머신 스택에서 참조되는 객체: 매개변수, 로컬 변수, 임시 변수 등
      • 메서드 영역의 정적 속성이 참조하는 객체, 상수가 참조하는 객체: 참조 유형 정적 변수, 문자열 상수 풀의 참조
      • 네이티브 메서드 스택에서 JNI가 참조하는 객체
      • JVM(Java Virtual Machine) 내부의 참조, 동기화 잠금이 보유한 모든 개체 등
  • 인용에 대해 알아보자

    • 강력한 참조: 프로그램 코드에서 어디에나 있는 참조 할당으로, 가비지 수집기는 참조된 개체를 절대 재활용하지 않습니다.
    • 소프트 참조: 여전히 유용하지만 필요하지 않은 개체이며 이러한 개체는 두 번째 재활용을 위한 재활용 범위에 포함됩니다.
    • 약한 참조: 다음 가비지 수집이 발생할 때까지 살아남는 비필수 객체
    • 팬텀 참조: 가장 약한 참조 관계, 가상 참조를 통해 개체 인스턴스를 얻을 수 없으며 재활용 시 시스템 알림을 받습니다.
  • 사느냐 죽느냐

    • 실제 사망은 두 번 표시해야 합니다. 참조 체인이 처음에는 finalize() 메서드를 한 번 저장할 수 있습니다.
  • 재활용 방법 영역

    • 메서드 영역 가비지 수집은 주로 두 부분, 즉 사용되지 않는 상수와 더 이상 사용되지 않는 유형을 재활용합니다.
    • 구식 상수: 다른 곳에서는 참조되지 않음
    • 미사용 유형: 모든 인스턴스가 재활용되었고, 클래스를 로드한 클래스 로더가 재활용되었으며, java.lang.Class 개체는 어디에서도 참조되지 않습니다.

2. 가비지 수집 알고리즘

  • 세대 수집 이론
    • 약한 세대 가설: 삶과 죽음
    • 강력한 세대 가설: 더 많은 가비지 수집에서 살아남은 개체는 소멸하기 더 어렵습니다.
    • 교차 세대 참조 가설: 개체 간에 교차 세대 참조가 있습니다.
    • 설계 원칙
      • 연령에 따라 구역을 나누어서 합치며(소수의 생존자만 주의), 소멸하기 어려운 물건은 합치기(이 구역은 빈도를 낮춰 재활용)
    • Minor GC(new generation collection), Major GC(old generation collection, CMS), Full GC, Mixed GC(mixed collection, G1)
    • 메모리 세트: Old Generation을 여러 개의 작은 블록으로 나누고, Old Generation의 어떤 메모리 조각이 교차 세대 참조를 가질지 식별하고, Minor GC 동안 GC Roots 스캔에 대한 교차 세대 참조가 있는 작은 메모리 개체를 추가합니다.
  • Mark-clear 알고리즘: 가장 기본적인 가비지 콜렉션 알고리즘, 불안정한 실행 효율, 메모리 공간 단편화 문제(다음 할당을 위한 연속 메모리 부족)
  • Mark-Copy Algorithm: 두 조각으로 나누어 하나의 조각이 소진되면 남은 조각을 다른 조각으로 복사한 다음 첫 번째 조각을 정리하면 메모리가 원본의 절반으로 줄어듭니다.
    • 대부분의 JVM(Java Virtual Machine)은 이 알고리즘을 사용하여 새로운 세대를 재활용하는 데 우선 순위를 부여하며 일반적으로 이전 세대에서 이 알고리즘을 직접 사용할 수 없습니다.
    • Appel 스타일 재활용: 새로운 세대는 더 큰 Eden 공간과 두 개의 작은 Survivor 공간으로 나뉩니다.Eden과 Survivor의 비율은 8:1입니다.과용량을 피하기 위해 할당 보장이 필요합니다.
  • 마크 정렬 알고리즘: 살아남은 객체는 메모리 공간의 한쪽 끝으로 이동한 다음 경계 외부의 메모리를 직접 정리합니다.
    • 움직이면 메모리 복구가 더 복잡해지고, 움직이지 않으면 메모리 할당이 더 복잡해집니다.
  • 및 진흙 유형: 일반적으로 마크 지우기 알고리즘을 사용하고 조각화가 큰 경우 마크 정렬 알고리즘을 사용합니다.

3. HotSpot 알고리즘 상세 구현

  • 루트 노드 열거
    • OopMap 데이터 구조는 객체 참조를 저장합니다. 클래스 로딩 작업이 완료되면 HotSpot은 스캔할 때 직접 사용할 수 있는 객체의 오프셋에서 데이터 유형을 계산합니다.
  • Safety point: GC Roots가 열거될 때 스레드를 일시 중지해야 하며 안전 지점이 설정되어 있으면 안전 지점에 도달한 후에만 중지할 수 있습니다.
    • 활성 인터럽트: 플래그 비트 설정, 각 스레드 폴링, 인터럽트 플래그가 발견되면 활성 인터럽트가 가장 가까운 안전 지점에서 일시 중지됨
  • 안전 영역: 스레드는 안전한 장소로 이동하여 중단 및 일시 중지할 수 없으므로 안전 영역(스레드는 안전 영역을 떠나 가상 머신이 루트 노드 열거를 완료했는지 확인해야 함) 메모리 세트 및 카드 테이블을 도입해야 합니다
    .
    • 메모리 세트: 전체 old generation을 GC Roots 스캐닝 범위에 추가하지 않도록 사용
    • 카드 표: 카드 정밀도(기록은 메모리 영역에 정확함)
      • Dirty: 카드 페이지의 개체 필드에 교차 세대 포인터가 있으며 플래그가 1이 되어 더러워진다는 의미입니다.
  • 쓰기 장벽: 카드 테이블의 상태 유지
    • 할당 전 쓰기 장벽을 사전 쓰기 장벽, 할당 후 쓰기 후 장벽이라고 합니다.
  • 동시 도달 가능성 분석
    • 삼색 마크
      • 흰색: 가비지 수집기가 개체에 액세스하지 않았음을 나타냅니다.
      • 검은색: 가비지 수집기가 객체를 방문했고 모든 참조가 스캔되었음을 나타냅니다.
      • 회색: 객체가 가비지 컬렉터에 의해 액세스되었으며 스캔되지 않은 참조가 하나 이상 있음을 나타냅니다.
    • 동시 스캔에서 사라지는 개체 수정: 증분 업데이트, 원본 스냅샷
      • 증분 업데이트: 흰색 개체(CMS)에 대한 참조를 삽입한 후 검정색 개체가 다시 회색 개체로 변경됩니다.
      • 원본 스냅샷: 참조 관계 삭제 여부와 관계없이 스캔이 막 시작된 ​​시점(G1, Shenandoah)의 개체 그래프 스냅샷을 기준으로 검색

넷째, 고전적인 가비지 컬렉터

여기에 이미지 설명 삽입

  • 직렬 수집기
    • 가장 기본적이고 가장 오래된 단일 스레드 수집기
    • 클라이언트 모드의 기본 젊은 세대 수집기
  • ParNew 컬렉터
    • 직렬 수집기의 다중 스레드 병렬 버전, 서버 모드에서 실행되는 HotSpot 가상 머신
    • ParNew는 CMS(-XX: +UseConcMarkSweepGC)를 활성화한 후 기본 차세대 수집기입니다(-XX: +UseParNewGC는 필수 또는 비활성화됨).
    • 병렬: 병렬은 여러 가비지 수집기 스레드 간의 관계를 설명합니다.
    • 동시: 동시는 가비지 수집기 스레드와 사용자 스레드 간의 관계를 설명합니다.
  • 병렬 스캐빈지 수집기
    • 마크 복사 알고리즘을 기반으로 한 차세대 수집기, 병렬로 수집된 다중 스레드 수집기는 제어 가능한 처리량을 달성합니다.
    • 처리량 = 사용자 코드 실행 시간 / (사용자 코드 실행 시간 + 가비지 수집 실행 시간)
    • -XX: MaxGCPauseMillis는 최대 가비지 수집 일시 중지 시간을 제어합니다.
    • -XX: GCTimeRatio는 처리량 크기를 직접 설정합니다.
  • 시리얼 올드 컬렉터
    • 직렬 수집기, 단일 스레드 수집, 마크 지우기 알고리즘의 이전 세대 버전
  • 병렬 이전 수집기
    • 이전 버전의 Parallel Scavenge 수집기, 다중 스레드 동시 수집, 마크 정렬 기반
    • 처리량이 중요하거나 프로세서 리소스가 부족한 상황에서는 Parallel Scavenge와 Parallel Old 수집기의 조합을 고려할 수 있습니다.
  • CMS 수집기
    • 마크 스윕 알고리즘, 동시 수집, 낮은 일시 중지를 기반으로 가장 짧은 복구 일시 중지 시간을 얻는 것을 목표로 하는 수집기
    • 네 단계
      • 초기 표시: GC Roots가 직접 관련될 수 있는 개체를 표시하기만 하면 프로세서 리소스에 빠르고 매우 민감합니다.
      • 동시 마킹: GC Roots의 직접 연결된 개체에서 시작하여 가비지 수집 스레드와 동시에 실행할 수 있는 전체 개체 그래프 프로세스를 통과합니다.
      • Re-marking: 병행 표기 수정 시, 사용자 프로그램의 계속적인 동작으로 인하여 표기가 변경된 대상 부분의 표기 기록
      • 동시 정리: 표시 단계에서 판단한 죽은 개체 정리 및 삭제
    • 초기 태깅, 재플래깅에는 여전히 "Stop The World"가 필요합니다.
    • 재활용 스레드 수: (프로세서 코어 수 + 3) / 4
    • "플로팅 가비지", 동시 마킹 및 동시 정리 단계를 처리할 수 없음, 사용자 스레드가 계속 실행되어 현재 컬렉션에서 처리할 수 없는 새 가비지 개체 생성
      • 동시 수집 시 프로그램 작업을 위해 공간의 일부를 예약해야 하며 공간의 68%가 사용된 후 Old Generation이 활성화됩니다.
  • 가비지 퍼스트 컬렉터
    • 주로 서버 측 애플리케이션을 위한 모든 기능을 갖춘 가비지 수집기는 메모리 재활용의 "동작"과 "구현"을 분리합니다.
    • 재활용을 위한 재활용 수집을 형성하기 위한 힙 메모리의 일부에 대해, Mixed GC 모드
      • 측정 기준은 더 이상 어느 세대에 속하는가가 아니라 어느 메모리 조각이 쓰레기를 가장 많이 저장하고 재활용 이점이 가장 큰가입니다.
    • Region의 힙 메모리 레이아웃을 기반으로 G1은 Java 힙을 동일한 크기의 여러 독립 영역(Regions)으로 나누고 각 Region은 필요에 따라 Eden 및 Survivor 공간으로 작동할 수 있습니다.
    • 단일 복구의 최소 단위로 Region 사용
    • 기억된 집합을 사용하여 GC 루트로 전체 힙 스캔을 방지합니다.
    • 네 단계
      • 초기 표시: GC Roots가 직접 관련될 수 있는 개체를 표시하기만 하면 됩니다.
      • 동시 마킹: GC Roots에서 시작하여 힙에 있는 객체의 도달 가능성 분석
      • 최종 표시: 사용자 스레드에서 또 다른 짧은 일시 중지
      • 스크리닝 및 복구: 지역의 통계 데이터 업데이트를 담당합니다.
    • G1은 대용량 메모리 애플리케이션에서 이점을 발휘할 수 있습니다.

5. 대기 시간이 짧은 가비지 컬렉터

  • 가비지 컬렉터 측정을 위한 중요한 메트릭: 메모리 사용량, 처리량, 대기 시간

5.1 셰넌도어 컬렉터

  • 모든 힙 메모리 크기에서 10밀리초 이내의 가비지 수집 일시 중지 시간을 제어할 수 있는 방법 구현
  • 동시 가비지 마킹 뿐만 아니라 오브젝트 정리 후 동시 정리 작업
  • G1과의 차이점
    • 동시성을 지원하는 데이터 정렬 알고리즘
    • 세대별 수집은 기본적으로 사용되지 않습니다.
    • 메모리 세트 대신 연결 매트릭스의 전역 데이터 구조를 사용하여 리전 간 참조 관계를 기록합니다.
  • 작업 과정
    • 초기 표시: GC Roots와 직접 연결된 개체
    • 동시 마킹: 개체 그래프를 순회하고 도달 가능한 모든 개체를 마킹합니다.
    • 최종 마크업: 나머지 SATB 스캔 처리
    • 동시 정리: 전체 영역에서 살아남은 개체가 없는 영역
    • 동시 재활용: 먼저 살아남은 개체를 사용하지 않는 다른 지역에 복사합니다.
    • 초기화 참조 업데이트: 힙의 이전 개체에 대한 참조는 복사 후 새 주소로 고정됩니다.
    • 동시 참조 업데이트: 참조 업데이트 작업의 실제 시작
    • 최종 참조 업데이트: GC Roots에 존재하는 참조 수정
    • 동시 정리: 전체 컬렉션 집합의 모든 지역에 살아남은 개체가 없습니다.
  • 중요 단계: 동시 표시, 동시 수집, 동시 참조 업데이트
  • 전송 포인터: 개체에 새 복사본이 있는 경우 하나의 포인터 값(새 개체를 가리키도록 이전 개체에 대한 전방 포인터의 위치)만 수정하면 됩니다.

5.2 ZGC 수집기

  • 동시 표시 정렬 알고리즘을 구현하기 위해 읽기 장벽, 컬러 포인터 및 메모리 다중 매핑을 사용하여 세대 없이 지역 메모리 레이아웃을 기반으로 합니다.
  • ZGC의 리전은 동적입니다. 동적으로 생성 및 소멸되며 동적 리전 용량 크기입니다.
    • 작은 영역: 용량은 2MB로 고정되며 256KB보다 작은 작은 개체를 배치하는 데 사용됩니다.
    • 중간 규모 지역: 용량은 32MB로 고정되어 있으며 256KB보다 크고 4MB보다 작은 객체가 배치됩니다.
    • Large Region: 용량이 고정되지 않고 동적으로 변경될 수 있으며, 2MB의 정수배여야 하며, 4MB 이상의 Large Object가 배치된다.
  • 염색 포인터 기술을 사용한 아이코닉한 디자인
  • 작업 과정
    • 동시 마킹: 동시 마킹은 도달 가능성 분석을 위해 객체 그래프를 순회하는 단계입니다.
    • 동시 예비 재분배: 특정 쿼리 조건의 통계에 따라 이 수집 프로세스에서 어떤 Region을 정리할지 결정하고 이러한 Region은 재분배 집합을 형성합니다.
    • 동시 재배포: 재배포 집합에서 살아남은 객체를 새 지역으로 복사하고 각 지역으로의 재배포를 위한 포워딩 테이블을 유지합니다.
    • 동시 재매핑: 재할당 집합의 이전 개체를 가리키는 전체 힙의 모든 참조를 수정합니다.

6. 올바른 가비지 컬렉터 선택

  • Epsilon: 무작동 수집기
  • 수집기 장단점: 처리량, 대기 시간, 메모리 공간
  • 가상 머신 및 가비지 수집기 로그
    • HotSpot의 모든 기능에 대한 로그는 "-Xlog" 매개변수로 반환됩니다.
  • 매개변수 요약

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

7. 메모리 할당 및 복구 전략

  • 개체는 Eden에서 처음 할당됩니다.
    • New generation의 Eden 영역에 객체를 할당하는데, Eden 영역에 할당할 공간이 부족하면 가상머신에서 Minor GC를 시작합니다.
  • 큰 객체는 Old Generation으로 바로 이동합니다.
    • 대형 객체: 연속된 메모리 공간이 많은 Java 객체(매우 긴 문자열, 요소 수가 많은 배열), 대형 객체는 높은 메모리 복사 오버헤드를 의미합니다.
    • HotSpot에는 다음이 포함됩니다. -XX: PretenureSizeThreshold 매개변수, 이 설정 값보다 큰 개체가 이전 세대에 직접 할당되도록 지정하여 Eden 영역과 두 Survivor 영역 사이에서 앞뒤로 복사하는 것을 방지합니다.
  • 수명이 긴 객체는 이전 세대에 진입합니다.
    • 가상 머신은 각 객체에 대해 나이 카운터를 정의하고 Minor GC에서 살아남을 때마다 나이가 1씩 증가합니다.
    • 이전 세대의 연령 임계값으로 올리기 -XX: MaxTenuringThreshold 설정
  • 동적 개체 연령 판단
    • Survivor 공간에 있는 같은 나이의 모든 객체 크기의 합이 Survivor 공간의 절반보다 크면 이 나이보다 크거나 같은 나이의 개체는 바로 Old Age에 진입합니다.
  • 공간 할당 보장
    • Minor GC 전에 가상 머신은 먼저 이전 세대의 최대 사용 가능한 연속 공간이 새로운 세대의 모든 객체의 총 공간보다 큰지 여부를 확인해야 합니다.
      • 설정되지 않은 경우 구세대에서 사용 가능한 최대 연속 공간이 구세대로 승격된 객체의 평균 크기보다 큰지 계속 확인한 다음 마이너 GC를 시작할 위험이 있습니다.
      • 실패 시 Full GC 트리거

추천

출처blog.csdn.net/baidu_40468340/article/details/128547957