Java

[JVM 밑바닥까지 파헤치기] 3-3. 가비지 컬렉터와 메모리 할당 전략: 구현

noahkim_ 2024. 12. 21. 20:00

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

1. 루트 노드 열거

  • GC 루트 노드로부터 참조 체인을 찾는 작업
    • 스택 프레임을 비롯하여 정적 변수, 레지스터 등을 포함하여 추적
  • 루트 노드를 열거하려면 stop the world를 피할 수 없음

 

OopMap

  • Object Offset Map
    • 각 스레드의 스택에 있는 객체 참조의 위치를 기록하는 맵
  • 안전 지점이라는 특정한 위치에만 기록
    • OopMap을 모든 명령어에 생성하지 않음

 

객체 이동 지원
  • GC에 의해 참조가 변경될 경우, 스레드 스택에 있는 참조가 올바르게 갱신되도록 합니다.

 

2. 안전

안전 지점

  • 일시 정지 상태를 트리거하는 지점
  • jvm이 스레드의 상태를 안전하게 분석하고, 참조 관계를 변경하지 않을 것임을 보장

 

자발적 멈춤
  • 플래그 비트 사용
    • 각 스레드들은 플래그 비트를 폴링
    • 플래그가 켜지면 가까운 안전 지점에서 스스로 멈춤
  • GC가 스레드 수행에 관여 X

 

선제적 멈춤
  • JVM이 인터럽트를 발생시켜 강제로 스레드들이 안전 지점까지만 실행되도록 함
  • 스레드의 코드가 GC 고려 안함
  • 예외
    • sleep, blocked 된 상태의 스레드는인터럽트 요청에 응답 못함
    • GC가 발생할 때, 안전 지점까지 수행될 수 없음
    • 이로 인해 거의 사용 안됨

 

예시
  • GC 실행
    • GC가 필요한 지점에 호출되도록 셋팅됨
    • GC가 실행되면 모든 스레드가 가장 가까운 안전 지점까지 실행하고 멈춤
  • 스레드 상태 확인
  • 메서드 호출 

 

안전 지역

  • GC가 실행되는 동안 스레드가 참조 관계를 변경하지 않도록 보장되는 영역
  • 사용자 스레드는 안전 지역에 진입했음을 표시함

 

성능 최적화
  • 안전 지역에 있다면 안전 지점까지 도달하지 않아도 GC가 제대로 동작할 수 있음

 

3. 기억 집합

  • 비회수 영역에 있는 객체들이 회수될 참조들을 기록하는 데이터 구조
  • 젊은 세대와 노년 세대간의 참조 관계를 추적하는 데 사용됨

 

정밀도

워드 정밀도
  • 메모리 워드 단위로 참조를 기록
  • 관리단위가 작음
  • 정확성 높음

 

객체 정밀도
  • 객체 하나에 대한 참조를 기록
  • 효율적인 공간 사용
  • 특정 객체 내 참조 위치를 정확히 파악하기 어려움

 

카드 정밀도
  • 메모리 블록 단위로 참조를 기록
  • 효율적인 공간 사용
  • 특정 객체 내 참조 위치를 정확히 파악하기 어려움

 

카드 테이블

  • 카드 정밀도로 참조를 기억할 때의 기록 공간
  • 바이트 배열로 참조 관리

 

카드 페이지
  • 메모리 블록 하나 사이즈
    • 한 카드 페이지는 특정 메모리 영역을 가리킴
  • 카드 페이지의 데이터가 변경되는 시점
    • 참조 타입 필드에 값이 대입되는 순간

 

객체 회수
  • 카드 테이블 확인
    • 더럽혀진 카드 페이지만 확인
  • 세대 간 참조 확인
    • 해당 영역에 세대간 포인터를 포함하는지 확인

 

4. 쓰기 장벽

  • 카드 페이지 관리 방식

 

AOP Aspect
  • 참조 타입에 객체가 대입되면 어라운드 어드바이스가 생성되어, 대입 전후로 추가 동작을 하도록 함 
  • 보통 대입 후로 추가동작이 실행됨

 

단점
  • 오버헤드 발생
  • 거짓 공유
    • 낮은 수준에서 동시성을 동기화할 경우 발생하는 문제
      • CPU의 캐시 시스템은 캐시 라인 단위로 관리
      • 공유하는 변수가 같은 캐시 라인에 있다면 동기화를 진행
      • 실제 공유하고 있지 않더라도 동기화, 라이트백, 무효화 등의 추가작업이 발생
    • 성능이 떨어짐

 

매개 변수
  • -XX: +UseCondCardMark: 거짓 공유 체크 활성화

 

5. 동시 접근 가능성 분석

삼색 표시 기법

  • 객체 그래프 탐색 중, 객체를 세가지 색으로 구분하여 어떤 상태인지 추적하는 알고리즘
  • 마주치는 객체들에 특정 조건의 방문 객체임을 체크

 

흰색
  • 가비지 컬렉터가 방문한 적 없는 객체
  • 최종 상태에서 흰색으로 남아있으면 회수됨

 

검은색
  • 가비지 컬렉터가 방문한 적 있는 객체
  • 해당 객체를 가리키는 모든 참조가 스캔이 완료된 상태
  • 확실히 생존함을 뜻함
    • 이미 검은색이라면 체크 안해도 됨

 

회색
  • 가비지 컬렉터가 방문한 적 있는 객체
  • 해당 객체를 가리키는 일부의 참조만이 스캔된 상태

 

객체 사라짐 문제

  • 사용자 스레드와 GC가 동시 수행 시, 문제 발생
  • 살아있는 객체를 죽었다 표시
  • 회수되지 않아야 할 객체가 회수됨