ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JVM] 가비지 컬렉터와 메모리 할당 전략 (2) - 클래식 가비지 컬렉터
    DevBook/JVM 밑바닥까지 파헤치기 2025. 3. 18. 00:23

    클래식 가비지 컬렉터

     

    *신세대용

    1. 시리얼 컬렉터

    • 가장 기초적이고 오래된 컬렉터, JDK 1.3.1 전까지 핫스팟 가상 머신의 구세대용 컬렉터로는 유일한 선택지였음
    • '단일 스레드'로 동작
      • 하나의 GC 스레드가 모두 처리한다.
      • GC가 시작되면 '회수가 완료될 때까지 다른 모든 작업 스레드가 멈춰 있어야 한다'
    • 특징
      • 시리얼 컬렉터는 최신 JDK에서도 꾸준히 지원하고 있음
      • 다른 컬렉터의 단일 스레드 알고리즘보다 간단하고 효율적이라는 이점이 있음
      • 가용 메모리가 적은 환경에서는 알고리즘 자체가 요구하는 메모리 사용량이 가장 적음 
      • 단일 코어 프로세서 또는 코어 수가 적은 환경이라면 시리얼 컬렉터는 스레드 상호 작용에 의한 오버헤드가 없음
    • -XX:+UseSerialGC 매개변수 추가하여 사용 가능

    시리얼 컬렉터: 신세대 GC, 시리얼 올드 컬렉터: 구세대 GC

     

    2. 파뉴 컬렉터

    • 여러 스레드를 활용해 시리얼 컬렉터를 병렬화한 버전
    • 메모리 회수에 멀티스레드를 이용한다는 점만 제외하면 나머지는 시리얼 컬렉터와 완전히 같음
      • 컬렉터 제어용 매개변수(-XX:SurvivorRatio, -XX:PretenureSizeThreshold 등), 컬렉션 알고리즘, 스톱 더 월드, 객체 할당 규칙, 회수 전략 등
    • 단일 코어 프로세서에서는 시리얼 컬렉터보다 성능이 떨어짐

    • 참고
      • JDK 7 전까지의 시스템들에서 신세대용 컬렉터로 인기가 높았음
        • 시리얼 컬렉터를 제외하고 CMS 컬렉터와 조합하여 사용할 수 있는 유일한 컬렉터였기 때문
      • G1 컬렉터의 등장으로 파뉴는 CMS에 통합됨
        • G1 가비지 컬렉터가 등장하여 CMS를 밀어내고 계승자가 되었음
          • G1은 힙 전체를 대상으로 하는 컬렉터여서 더는 신세대용 컬렉터와 협력할 필요가 없게 됨
        • G1이 모든 컬렉터를 완벽히 대체하기를 원했기 때문에, '파뉴+시리얼 올드' 조합과 '시리얼+CMS' 조합을 지원하지 않게 됨

     

    추가) 병렬과 동시

    더보기
    • 병렬(parallel) : GC 스레드들 사이의 관계 설명
      • GC 스레드 다수가 동시에 함께 작업을 수행한다는 뜻
      • 이때 사용자 스레드는 정지 상태
    • 동시(concurrent) : GC 스레드와 사용자 스레드 사이의 관계 설명
      • GC 스레드와 사용자 스레드가 동시에 일을 진행한다는 뜻
      • 사용자 스레드가 멈춰 있지 않아서 어플리케이션은 서비스 요청에 여전히 응답할 수 있음
      • GC 스레드가 시스템 자원 일부를 점유하므로 어플리케이션 처리량은 평소보다 낮아질 수 있음

     

    3. 패러렐 스캐빈지 컬렉터 (PS 컬렉터)

    • 신세대용 컬렉터
    • mark-copy 알고리즘에 기초하며 여러 스레드를 이용해 병렬로 회수하는 등 파뉴 컬렉터와 유사함
    • 처리량을 제어하는 게 목표
      • CMS 같은 컬렉터는 GC 동안 사용자 스레드의 일시 정지 시간을 최소로 줄이는 데 집중함
      • 처리량이란?
        • 프로세서가 사용자 코드를 실행하는 데 사용하는 시간과 프로세서가 소비하는 총 시간의 비율
        • 처리량 = 사용자 코드 실행 시간 / (사용자 코드 실행 시간 + 가비지 컬렉터 실행 시간)
        • ex) 가상 머신이 일을 완료하기까지 사용자 코드와 GC에 쓴 시간이 총 100분
          • 이때 GC에 1분이 소요되었다면, 처리량은 99%가 됨

    관련 매개변수

    더보기
    • -XX:MaxGCPauseMillis
      • 정지 시간의 최대값 지정 (0보다 큰 값 설정)
      • 컬렉터는 메모리 회수에 소요되는 시간이 이 설정값을 넘지 않도록 함
      • 주의)
        • 해당 값을 작게 설정한다고 해서 시스템의 GC가 무조건 빨라지는 것은 아님
        • GC로 인한 정지 시간을 줄이면 처리량이 낮아지고, 신세대의 크기가 더 작게 할당됨
          • 500MB 메모리보다 300MB 메모리를 회수하는 쪽이 빠르듯이 신세대의 크기가 작아야지 줄어든 정지 시간 내 수행 가능함
          • 용량이 줄어든 만큼 더 자주 회수해야 함
          • 따라서 정지 시간은 줄었지만 처리량 역시 줄어드는 것
    • -XX:GCTimeRatio
      • 어플리케이션의 총 실행 시간에 대한 GC 시간의 비율
      • 해당 값이 N이라면, 가비지 컬렉터가 사용자 코드 실행 시간의 1/(1+N) 이상 소비하지 않게 해달라는 뜻
        • 기본값 99
    • -XX:+UseAdaptiveSizePolicy
      • 일종의 스위치 매개변수로, 해당 매개변수를 켜면 신세대의 크기(-Xmn), 에덴과 생존자 공간의 비율(-XX:SurvivorRatio), 구세대로 옮겨갈 객체의 크기(-XX:PretenureSizeThreshold) 등 세부 설정용 매개변수들을 일일이 지정하지 않아도 됨
      • 가상 머신이 성능 모니터링 정보를 수집하여 최적의 정지 시간과 최대 처리량을 제공할 수 있도록 모든 매개변수의 값을 동적으로 조율해줌
        • 힙의 최대 크기를 지정하는 -Xmx 같은 기본적인 메모리 정보만 설정해 두고, 최대 정지 시간(-XX:MaxGCPauseMillis)이나 처리량(-XX:GCTimeRatio)에 대한 목표만 설정하면 됨
      • PS 컬렉터를 파뉴 컬렉터와 차별화하는 중요한 특성 

     

    *구세대용

    1. 시리얼 올드 컬렉터

    • 시리얼 컬렉터의 구세대용 버전
    • 단일 스레드 컬렉터이며 mark-compact 알고리즘 사용

     

    2. 페러렐 올드 컬렉터

    • PS 컬렉터의 구세대용 버전
    • 멀티스레드를 이용한 병렬 회수를 지원하며 mark-compact 알고리즘을 기초로 구현됨
    • 처리량이 중요하거나 프로세서 자원이 부족한 상황이라면 PS와 페러렐 올드 조합을 고려해보자
      • -XX:+UseParallelGC 매개변수 지정하여 사용

    댓글

Designed by Tistory.