본문 바로가기
java

[java] 가비지 콜렉션의 종류(GC: Garbage Collection)

by hs_seo 2019. 7. 24.

GC의 종류에 대해서 알아보겠습니다.

SerialGC

  • 싱글 스레드로 Young 영역, Old 영역을 처리
  • 하나의 스레드를 이용해서 동작하기 때문에 멀티 스레드 환경의 서버 프로그램에서는 부적합
  • 일시 중지에 관대한 클라이언트 프로그램이나 테스트용 프로그램에 적합
  • java -XX:+UseSerialGC
  • Mark-Sweep-Compact 알고리즘을 이용
    • Mark: 살아 있는 객체를 선택
    • Sweep: 선택되지 않은 객체를 정리
    • Compact: 메모리 공간을 압축

ParallelGC

  • Minor GC를 여러개의 스레드를 이용하여 동시에 처리
    • Major GC는 싱글 스레드로 처리
  • SerialGC보다 빠르지만 더 많은 자원을 소모
  • Mark-Sweep-Compact 알고리즘을 이용
  • java -XX:+UseParallelGC

serial_vs_parallel

Parallel Old GC

  • Minor GC, Major GC를 모두 여러개의 스레드를 이용하여 동시에 처리
  • Mark-Summary-Compaction 알고리즘을 이용
    • Mark-Summary-Compaction 단계를 수행
    • Summary 단계에서 메모리를 인덱싱하는 작업을 수행
      • Sweep은 싱글 스레드로 처리되고, Summary는 멀티 스레드로 처리하면서 이전 컴팩션정보를 함께 이용
  • java -XX:+UseParallelOldGC

CMS(Concurrent Mark & Sweep) GC

  • SerialGC, ParallelGC와 다른 알고리즘을 이용하여 작업이 멈추는 시간을 줄임
  • Stop-The-World 시간이 짧지만, 다른 GC에 비해 많은 메모리와 CPU를 사용
  • Compaction 단계가 기본적으로 제공되지 않아서 메모리 파편화가 발생할 수 있음
  • java -XX:+UseConcMarkSweepGC
  • 동작 방식
    1. Root Set에 의해 직접 참조되는 객체들을 선택(initial mark)
      • Root Set: 현재 참조중인 객체를 판단하기 위한 메모리 주소 모음
    2. 애플리케이션 동작 중 살아있는 객체 식별 (concurrent mark)
    3. 2번에서 새로 추가로 참조가 끊긴 객체를 확인 (remark)
    4. 참조가 끊긴 모든 객체를 정리 (concurrent sweep)

cms

G1GC

  • 메모리를 블록단위의 region으로 나누어서 데이터를 할당
    • Young, Old 영역이 없음
    • 블록을 사용 목적으로 구분하여 데이터를 할당하고, 해당 블록만 GC를 실행
  • -XX:UseG1GC

g1gc

공통

  • GC로그를 출력하기 위해서는 다음의 옵션을 입력
    • java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps

 

 

참고

반응형