JAVA - 가비지 컬랙터

choko's avatar
Jun 29, 2024
JAVA - 가비지 컬랙터
 

가비지 컬랙터

  • 가비지 컬랙터
    • JVM의 힙 영역에서 동적으로 할당했던 메모리 중 필요없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스
    • 가비지 컬랙션의 대상은 유효한 래퍼런스가 없는 객체이다.
    •  
  • 가비지 컬랙터의 청소 방식
      1. Stop The World : 가비지 컬랙션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업, GC가 완료되면 작업이 재개된다.
      1. Mark(식별) : Root space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아 마킹
      1. Sweep(제거) : 마킹되어 있지 않은 객체들을 힙에서 제거함
      1. Compact(압축) : Sweep이 끝난 객체들을 Heap의 시작 주소로 모아 압축시킴
       
  • Heap 메모리의 구조
    • Heap 영역에서의 데이터는 다음 2가지 전제로 설계됨
        1. 대부분의 객체는 금방 접근 불가능한 상태가 된다(Young).
        1. 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다(Old).
        → 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다.
        → 이러한 특성을 이용해 JVM에서 힙을 YoungOld 영역으로 설계하였다.
        • Young 영역에서의 GCMinor GC, Old 영역에서의 GCMajor GC라고 부른다.
        • 대부분 Young 영역의 수명이 짧은 객체들은 크기가 작기 때문에, Old 영역이 Young 영역보다 크게 할당된다.
       
  • 가비지 컬랙터의 알고리즘 종류
    • Stop the world가 빈번하게 발생하면 애플리케이션이 중지되는 문제가 자주 발생한다. 이를 최적화하기 위해 다양한 GC 알고리즘이 개발되었다.
    • GC 알고리즘은 모두 설정을 통해 Java에 적용할 수 있다.
    • Parallel GC
      • Java 8의 디폴트 GC
      • Young 영역의 Minor GC를 멀티스레드로 수행, Old 영역은 싱글스레드
    • Parallel Old GC
      • Young 영역 뿐 아니라 Old 영역에서도 멀티스레드로 GC 수행
    • G1 GC
    • ZGC
    •  
 
 
Share article

Tom의 TIL 정리방