[JAVA] GC에 대하여

2024. 3. 15. 16:03Web/JAVA

Garbage Collection

자바에서 할당된 메모리들에 대해 Garbage Collector(GC)가 자동으로 불필요한 메모리를 수집해 해제해주는 역할을 담당

동적으로 할당된 메모리 영역 가운데 더이상 사용하지 않거나 불필요하게 할당된 영역을 탐지하여 자동으로 해제하는 기법

장점

  • 유효하지 않은 포인터 접근 : 이미 해제된 메모리에 접근하는 버그를 방지한다.
  • 이중 해제 : 이미 해제된 메모리를 또 다시 해제하는 버그를 방지
  • Memory leak 방지 : 더 이상 필요하지 않은 메모리가 해제되지 않고 남아있어 메모리가 부족해 프로그램 중단되는 버그 방지

단점

  • Garbage Collection 이 발생하는 시점을 예측하기 어려움
  • 할당된 메모리가 해제된 시점을 알수없다.
  • GC가 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생할 수 있다. (stop-the-world(stw))

Mark-Sweep-Compact-Algorithm

  • Mark : Garbage Collector가 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스 하고있는지 찾는 과정
  • Marking 작업을 하기 위해 모든 스레드는 중단되는데 이를 stop the world 라고 부른다
  • Sweep : Mark 되어있지 않은 모든 오브젝트들을 힙에서 제거하는 과정이 Sweep

GC 알고리즘 종류

1 . Serial GC

  • JDK 5, 6에서 사용되며 싱글 스레드로 수행되는 가장 간단한 방식의 GC
  • 데스크톱의 CPU 코어가 하나만 있을 때 사용하기 위해서 만든 방식
  • Mark-Sweep-Compact 알고리즘을 사용한다.

 

2 . Parallel GC

  • JDK 8의 Default GC 방식으로 멀티 스레드로 GC 작업이 수행된다.
  • Serial GC와 사용되는 알고리즘은 동일하지만 멀티 스레드로 작업이 수행되어 GC 수행 시간이 짧다.  Stop The World 시간이 짧다.
  • Old 영역에서는 싱글 스레드로 수행되고, Young 영역에서는 멀티 스레드로 수행된다.

3 . Concurrent & Mark & Sweep GC ( CMS GC)

  • CMS GC는 GC가 수행되는 동안 Stop The World 시간을 최소화하는데에 초점을 둔 방식이다.
  • 이름 그대로 다른 스레드들과 동시에 수행되며(Concurrent) 객체들을 마킹(Mark)하고 삭제하는 작업(Sweep)이 수행된다.
  • JDK 9이후로는 사용되지 않으며, JDK14부터는 지원이 종료되었다.

4 . Garbage First GC(G1 GC)

  • JDK 9의 Default GC로 메모리와 CPU를 많이 차지하는 CMS GC 문제점을 개선한 방식이다.
  • 기존 Heap 영역을 구분하는 방식과 다르게 Heap 영역을 바둑판처럼 임의의 region으로 나누고 그중 살아있는 객체가 적게              들어있는 region부터 GC 작업을 수행하는 방식이다.
  • G1 GC 특징
    • 앞의 GC들은 Heap 영역을 Young 영역과 Old 영역으로 나눠 GC 작업이 수행되지만 G1 GC는 Heap을 여러 region으로 나누고 각 region들은 각자의 역할을 동적으로 할당받아 수행한다.
    • 이전 Heap과는 다르게 각 영역들이 고정된 사이즈가 아니고 연속적이지 않기 때문에 각 객체의 크기에 따라 메모리 할당을 할수있어 메모리 부담이 적다.
    • Heap region 할당 과정

할당되기전 Heap 영역은 고정된 크기의 영역으로, 하나의 메모리 영역이다.
Java가 실행될 때 JVM은 Heap의 영역 크기를 설정하여 region 별로 나눈다.

  • G1 GC 동작과정
  • Young GC
    • Eden, Survivor 영역에서 수행되며 Eden에서 GC 이후 살아있는 객체를 Survivor 영역으로 이동시키고 비워진 Eden영역은 Available 영역으로 변경된다.
  • Full GC

  • Initial Mark
    Old Region에 남아있는 객체들이 참조하고 있는 Survivor Region을 찾는다. 이때 Stop The World가 발생한다.
  • Root Region Scan
    Initial Mark 단계에서 찾은 Survivor Region에서 GC 작업 대상이 있는지 확인한다.
  • Concurrent Mark
    Heap 영역에서 전체 Region을 스캔하며 GC 대상 객체가 발견되지 않은 Region은 다음 단계에서 제외되도록 한다.
  • Remark
    스캔이 끝나면 GC 대상에서 제외될 객체를 식별한다. 이때 Stop The World가 발생한다.
  • Clean up
    살아있는 객체가 가장 적은 Region 부터 사용되지 않은 객체를 제거한다. 이때 Stop The World가 발생한다.
    완전히 비어진 Region은 재사용 가능한 형태로 동작한다.
  • Copy
    GC 대상이였지만 완전히 비워지지 않은 Region의 살아남은 객체들은 새로운 Region에 복사하여 Compaction 과정을 수행한다. 이때 Stop The World가 발생한다.

5 . Z GC

  • JDK11부터 실험적으로 도입된 GC로 메모리 구조를 여러 사이즈의 Z Page영역으로 나눠 메모리를 관리하는 방식
  • Stop The World 시간이 최대 10초를 넘지 않고 Heap의 크기가 증가한다해도 Stop The World 시간이 크게 늘어나지 않기 때문에 큰 Heap 메모리에 적합한 방식이다.
  • GC가 실행될 때 마킹된 객체들을 새로운 영역을 만들어 집어넣고 기존 꽉 찬 영역은 GC가 수행되어 삭제된다.