[Java] Garbage Collection 정리

Woong·2022년 9월 7일
0

Java

목록 보기
1/21

Garbage Collection

  • 스레드 root 에서 접근 불가능한 상태 (Unreachable)일 경우 GC 대상이 된다.
  • GC 는 System.gc() 를 통해 명시적으로 호출하는 것도 가능하나, stop-the-world 로 인해 시스템 성능에 큰 영향을 끼치므로 절대 사용하지 않도록 한다.

stop-the-world

  • Garbage collection 을 위해 애플리케이션의 모든 스레드 실행을 멈춘다.
    • GC 스레드 제외
  • 이를 stop-the-world 라 한다.
  • 이로 인해 성능에 영향이 크게 미칠 수 있기 때문에, Minor GCMajor GC 로 나뉜다.

Young 영역 (Young Generation 영역)

  • 객체가 생성되면 Young 영역에 할당된다.
    • 대부분의 객체는 접근 불가 상태가 되므로 Young 영역에 할당되었다가 소멸하는 경우가 대부분
    • Young 영역에 대한 Garbage Collection 을 Minor GC 가 발생한다고 한다.
  • Eden 1개, Survivor 2개로 구분
    • Eden 영역에서 GC가 일어난 후 하나의 Survivor 영역으로 이동
    • Survivor 영역 하나가 가득 차면, 살아남은 객체는 다른 Survivor 영역으로 이동
      • 가득찼던 Survivor 영역은 비우게 된다 -> 즉 하나의 Survivor 영역은 반드시 비어있어야한다.
      • 이 과정을 반복하며 살아남은 객체는 Old 영역으로 이동

Old 영역 (Old Generation 영역)

  • Young 영역에서 살아남은 객체가 이동되는 영역
    • Old 영역에 대한 Garbage Collection 을 Full GC, Majar GC 라 한다.

GC 모니터링

  • cli 에서 모니터링한다면 jstat 을 활용할 수 있다.
    • -gc 혹은 -gcutil 옵션을 통해 모니터링 (gcutil 은 백분율 통계 위주)
    • jstat -gcutil <pid> <interval>
    • S1, S0, E(Eden), O(Old), YGC, YGCT, FCT, FGCT, GCT
    • YGCT, FGCT, GCT 는 각각 GC에 걸린 시간을 나타난다.
  • Full GC 가 특히 성능 영향에 주요한

0개의 댓글