[CS][Java] JVM의 GC(Garbage Collector)

손경이·2024년 5월 1일
0

CS Study

목록 보기
21/25

JVM의 GC(Garbage Collector)


JVM에서 메모리를 관리해주는 모듈, Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈

용어 정리
Garbage Collection : 사용하지 않는 메모리 공간의 메모리를 해제하는 행위, 쓰레기를 청소하는 행위
Garbage Collector : Garbage Collection을 수행하는 주체, root space로 부터 참조되고 있지 않는 객체들을 가비지로 판단해서 메모리 공간을 회수하는 역할을 하는 프로그램

JVM 참고하기
JVM 구조 참고하기


> GC(Garbage Collector)

  • JVM에서 메모리를 관리해주는 모듈
    • Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈

  • GC의 대상이 되는 영역은 JVM 내에서도 Heap 영역
    • **Heap : 객체를 동적으로 생성하게 되면 인스턴스가 Heap 영역의 메모리에 할당

  • GC 과정
    1. 객체가 생성되면 Eden 영역에 저장됨
    2. Eden 영역이 가득차면 Stop-the-World(STW) 상태가 되고 minor GC(young GC)가 일어남
      • 자바의 경우 Mark and Sweep 방식
    3. GC에서 살아남은 객체들은 Survivor 영역으로 옮겨짐
    4. Survivor 영역이 가득차면 2번 GC 과정이 반복됨, 이때는 살아남은 객체들은 age가 증가고 비어있는 다른 Survivor 영역으로 옮겨감
      • Survivor1과 Survivor2를 번갈아 가면서 사용, 2개를 같이 사용하는 일은 없음
    5. Survivor 영역에 있는 객체들은 특정 age 이상이 되면 Old 영역으로 이동, 이를 Promotion이라고 함
    6. 5번 과정이 반복되어 Old 영역도 가득 차게 되면 major GC(full GC)가 발생, 이때 STW 상태가 되고 Mark and Sweep 방식에 Compaction을 함(살아 남은 객체들을 앞에서 부터 하나씩 채우는 방법)

용어 정리
Stop-the-world(STW)

  • 자바에서 GC를 수행하기 위해서 스레드의 작업을 멈추고 GC를 수행
  • GC를 수행한 후 다시 이어서 작업을 수행
  • STW가 길어지면 장애가 발생할 수 있음

> GC 장점

  • 개발자가 직접 메모리를 관리할 필요 없음
    • 실수로 메모리를 해제하는 경우를 줄일 수 있음
    • 메모리 누수를 줄일 수 있음

> GC 단점

  • GC 작업이 JVM에서 처리를 해서 직접 작성할 때보다 Overhead가 발생하게 됨
  • GC 작업 타이밍을 정확히 예측할 수 없음
    • 개발자가 메모리 공간이 언제 해제되는지 알 수 없음
  • Mark and Sweep 과정에서 참조되지 않는 객체를 찾을 때 스레드가 잠깐 중단(Stop-the-World)되어서 성능이 떨어짐

> GC 의 종류

  • Serial GC
    • 싱글 스레드로 동작
    • 싱글 스레드로 동작해서 STW 시간이 짧음
    • Mark and Sweep and Compaction 방식을 사용
      **사용되지 않는 객체를 식별하고 (Mark) 한후 객체들을 제거(Sweep)합니다. 그 후 살아 남은 객체들을 앞에서 부터 하나씩 채워(Compaction) 나가는 방법입니다.

  • Parallel GC
    • java 8의 기본 GC
    • Eden, Survivor 영역인 young 영역에서만 멀티 스레드로 동작
    • 멀티 스레드를 사용해서 Serial GC에 비해 STW 시간이 짧음
    • Minor GC 영역의 스레드 개수를 결정

  • Parallel-Old GC
    • 모든 영역이 멀티 스레드로 동작
    • Old 영역의 major GC에서도 스레드를 도입하여 Mark and Sweep Compaction에서 Mark and Summary Compaction으로 바꾸었음
    • Sweep은 단일 스레드에서 Summary는 여러 스레드에서 동작
    • 스레드의 개수 결정

  • CMS(Concurrent Mark Sweep) GC
    • STW를 최소화 하기 위해서 등장
    • GC 대상을 최대한 자세히 파악 후 정리하는 시간을 짧게 가져 가는 기법
    • 다른 GC 방식보다 메모리와 CPU를 더 많이 사용
    • Compaction 단계를 제공하지 않음

  • G1 GC
    • java 9의 기본 GC
    • Eden, Survivor, Old 영역들이 고정된 크기로 고정된 위치에 존재하지 않음
    • 전체 Heap 메모리를 Region이라는 특정한 크기로 나누어 동적으로 역할을 담당
    • 탐색 속도 빠름

GC 알고리즘 알아보기


참고

0개의 댓글