Java

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

noahkim_ 2024. 12. 21. 00:25

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

 

1. 세대 단위 컬렉션 이론

  • 대부분의 GC들의 근간 이론
  • 객체들을 나이에 따라 각기 다른 영역에 할당
    • 죽을 운명인 객체들을 한데 모음
    • 살아남을 객체를 나이가 있는 곳의 영역에 유지

 

가설

약한 세대 가설
  • 대다수 객체는 일찍 죽음
  • 메모리 접근 최적화
    • Young Generation을 대상으로 GC를 자주 실행시킴

 

강한 세대 가설
  • 살아남은 횟수가 늘어날수록, 더 오래 살 가능성이 높음
  • 메모리 접근 최적화
    • 장기 생존하는 객체는 Old Generation로 이동
    • Old Generation를 대상으로 GC를 자주 실행하지 않음

 

세대 간 참조 가설
  • 세대 간 참조의 개수는 같은 세대 안에서의 참조보다 훨씬 적음
  • 상호 참조 관계
    • 두 객체는 삶과 죽음을 함께하는 경향이 있음
      • 결국 같은 세대가 되므로 세대 간 참조는 자연스럽게 사라지게 됨
    • 신세대에 기억 집합을 두어 어디에 세대 간 참조가 있는지 기록
      • 세대 간 참조 수는 매우 적으므로 구세대 전체를 스캔하는 건 낭비

 

GC 종류

Minor GC
  • Young Generation 영역 회수

 

Major GC
  • Old Generation 영역 회수

 

Full GC
  • 전체 영역 회수

 

2. Mark-Sweep 알고리즘

과정

Mark
  • 회수할 객체들을 모두 표시

 

Sweep
  • 표시된 객체를 모두 회수

 

단점

실행 효율이 일정하지 않음
  • 회수할 객체가 많다면 Mark, Sweep 과정이 많아짐

 

메모리 파편화가 심함
  • Sweep 이후, 메모리는 불연속적으로 파편화 됨

 

3. Mark-Copy 알고리즘

  • Mark-Sweep을 보완한 알고리즘

 

세미 스페이스 복사 알고리즘

  • Young Generation 대상
  • 메모리를 두 개의 영역으로 나눔
    • From Space: 객체들을 한쪽에 생성
    • To Space: 살아남은 객체만 From Space에서 순서대로 복사

 

장점
  • 메모리 단편화 방지

 

단점
  • 메모리 낭비: 메모리를 반밖에 사용할 수 없음

 

아펠 스타일 복사 알고리즘

  • 세미 스페이스 복사 알고리즘의 메모리 낭비를 보완하기 위한 방식

 

메모리를 여러개의 영역으로 나눔
  • Young Generation (9): Eden (8) - Survivor1 (1) - Survivor2 (1)
  • Old Generation (1)

 

메모리 할당 보증
  • Young Generation의 메모리가 부족하면 Old Generation이 이를 보증
  • Old Generation의 메모리가 부족하면 Full GC가 수행됨

 

3. Mark-Compact 알고리즘

  • Mark-Copy는 생존율이 높을수록 복사할게 많아 효율이 좋지 않음
  • 객체를 압축함 (메모리 이동)
    • 생존한 모든 객체를 메모리 영역의 한쪽 끝으로 이동시킴
    • 일시 정지 현상이 발생 (stop the world)

 

장점
  • 연속된 사용 가능한 메모리 공간 확보
    • 남은 공간을 한꺼번에 비움

 

단점
  • 회수 작업이 복잡
    • 객체 이동으로 인한 참조 업데이트 필요