가비지 컬렉터(GC)

Single Ko·2023년 4월 5일
0

java

목록 보기
14/28

가비지 컬렉터란?

  • 더 이상 사용하지 않는 메모리를 회수하여 메모리를 자동으로 관리하는 Java 런타임 환경의 구성 요소입니다. 가비지 수집기의 주요 목적은 더 이상 필요하지 않은 개체가 차지하는 메모리를 해제하여 메모리 누수를 방지하고 애플리케이션의 성능을 최적화하는 것입니다.

  • 프로그램이 동적으로 할당했던 메모리 영역(Heap)중 필요 없게 된 영역을 알아서 해제 -> 자바는 GC가 알아서 메모리를 관리한다.(사용자가 수동으로 관리 할 필요가 없다. 하지만 사용자가 수동으로 관리 할 수 없다.)

    장점

    • 메모리 누수 방지
    • 헤제된 메모리에 접근 방지
    • 중복 메모리 해제 방지

    단점

    • GC의 작업은 순수한 오버헤드
    • 개발자는 언제 GC가 메모리를 해제하는지 모름.
    • 실시간성이 강조되는 프로그램의 경우에는 GC사용이 알맞지 않을 수 있음.

JVM의 GC

  • JVM의 GC는 Mark-and-Sweep 방식으로 이루어진다.
    1. Mark : GC는 "루트 개체"(전역 변수, 스레드 스택 등)에서 모든 라이브(도달 가능한) 개체를 식별. 도달 가능한 모든 객체를 표시하여 아직 사용 중임을 나타낸다.(마크함)
    2. Sweep : GC는 힙에서 더 이상 필요하지 않은 것으로 간주되는(마크 되지 않은 객체) 개체가 차지하는 메모리를 회수합니다.
  • Stop-the-World
    1. GC 프로세스 중에 애플리케이션 실행을 일시 중지하는 것을 말합니다. 애플리 케이션 실행중에 GC가 실행 될 수 있기때문에 Stop-the-World가 일어나는데, 성능에 큰 영향을 줄 수 있다.

GC의 버전

  • Parallel GC(Throughput Collector): Minor 및 Major GC를 병렬로 수행하여 GC에 소요되는 시간을 줄이는 멀티 쓰레드 GC. - Java 9 이전의 GC
  • G1(Garbage First) GC: 힙을 더 작고 동일한 크기의 영역으로 나누고 각 영역에 병렬로 가비지 컬렉션을 수행. 가장 많은 가비지가 있는 영역에서 우선적으로 가비지를 수집. 퍼즈 시간을 줄이고, 메모리 단편화를 방지, 대용량 힙을 효율적으로 관리 한다. - Java 9부터 현재까지 기본 GC.
  • 이 외에도 다양한 GC가 존재한다. CMS(Concurrent Mark Sweep) GC, ZGC(Z Garbage Collector) 및 Shenandoah GC등..

GC의 영역과 작동

  1. Eden: 새 객체가 생성되는 힙 영역입니다. Eden 공간이 가득 차면 minor garbage collection이 실행 됩니다.

  2. Survival 영역 : S0 및 S1이라는 두 영역으로 구성되며, 최소 한 번의 마이너 가비지 수집에서 살아남은 객체를 보관합니다. 마이너 GC가 발생하면 Eden과 survivor 영역 중 하나의 라이브 객체가 다른 servivor 공간으로 이동 됩니다. 마이너 GC가 발생할 때마다 서바이버 공간이 교체됩니다.

자바의 객체를 살펴보니 대부분의 객체들은 수명이 짧았다. 그 점에 착안해서 GC를 설계. Young Generation과 Old Generation으로 나눴음.

  • Young Generation: Eden 공간과 Survivor 공간(S0 및 S1)으로 구성됩니다. 새로 생성된 개체 및 몇 가지 가비지 컬렉션에서만 살아남은 개체 전용 힙 영역입니다. minor GC는 Young Generation에서 발생합니다.
  • Old Generation(Tenured Generation): 여러 Minor GC에서 살아남은 수명이 긴 개체가 이동되는 힙 영역입니다. Main GC(full GC라고도 함)은 Old Generation에서 발생하며 일반적으로 마이너 GC보다 시간이 더 많이 걸리고 빈도도 적습니다.

JVM의 GC는 튜닝이 가능합니다. 다만 일반적으로 그 전에 코드 레벨에서의 개선이 먼저 선행되어야 한다. GC의 튜닝은 성능 개선의 최종 단계

profile
공부 정리 블로그

0개의 댓글