🍎 Backend/JAVA

[JAVA] Garbage Collector, GC

밈98 2025. 1. 30. 16:24

가비지 컬렉션(Garbage Collection, 이하 GC) 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신) Heap 영역에서 동적으로 할당했던 메모리 필요 없게 메모리 객체(garbage) 모아 주기적으로 제거하는 프로세스를 말한다.

 

 

STW (Stop The World)

GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상을 의미.

GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있다.

따라서 시간을 최소화 시키는 것이 쟁점이다.

 

GC의 장점

  • 메모리 관리가 자동화되어 개발자가 직접 메모리를 해제할 필요가 없습니다.
  • 메모리 누수를 방지할 수 있습니다.
  • 안정성이 높아집니다.

GC의 단점

  • GC가 실행되는 동안 애플리케이션의 성능이 일시적으로 저하될 수 있습니다.
  • GC의 동작 방식과 타이밍을 예측하기 어렵습니다.
  • 메모리 사용량이 증가할 수 있습니다.

개발자로서 GC를 꾸준히 모니터링 해야하는 이유

  1. 성능 최적화: GC가 너무 자주 발생하거나 오래 실행되면 애플리케이션의 성능이 저하될 수 있습니다. 이를 모니터링하여 최적화할 수 있습니다.
  2. 메모리 누수 감지: GC가 제대로 동작하지 않으면 메모리 누수가 발생할 수 있습니다. 이를 조기에 감지하여 해결할 수 있습니다.
  3. 시스템 안정성: GC가 과도하게 실행되면 시스템이 불안정해질 수 있습니다. 이를 모니터링하여 시스템의 안정성을 유지할 수 있습니다.

GC에서 사용하는 알고리즘

  1. Mark-Sweep: 사용 중인 객체를 마크하고, 마크되지 않은 객체를 제거합니다. 단편화 문제가 발생할 수 있습니다.
  2. Mark-Compact: Mark-Sweep과 유사하지만, 제거 후에 남은 객체를 압축하여 단편화를 줄입니다.
  3. Copying: 메모리를 두 영역으로 나누고, 사용 중인 객체를 한 영역에서 다른 영역으로 복사한 후, 원래 영역을 모두 제거합니다.
  4. Generational: 객체의 생존 기간에 따라 메모리를 여러 영역으로 나누고, 각 영역에 대해 적절한 GC 알고리즘을 적용합니다.

Java는 주로 Generational GC를 사용하며, Java 8 기준으로는 Parallel GC가 기본입니다. Java 11부터는 G1 GC가 기본 GC로 사용됩니다.

Java 8에서의 Garbage Collection

Java 8에서는 기본적으로 Parallel GC가 사용됩니다. Parallel GC는 Young Generation과 Old Generation으로 나뉘며, Young Generation에서는 Copying 알고리즘을, Old Generation에서는 Mark-Compact 알고리즘을 사용합니다. Parallel GC는 멀티스레드를 사용하여 GC를 수행하므로, 멀티코어 환경에서 효율적입니다.

 

자바에서 Garbage Collection Heap 영역이 Young Generation과 Old Generation으로 나뉘는 이유

  1. 객체 생존 기간: 대부분의 객체는 생성 후 짧은 시간 내에 사용되지 않습니다. 따라서 Young Generation에 객체를 먼저 할당하고, 생존한 객체만 Old Generation으로 이동시킵니다.
  2. GC 효율성: Young Generation에서는 Copying 알고리즘을 사용하여 빠르게 GC를 수행하고, Old Generation에서는 Mark-Compact 알고리즘을 사용하여 단편화를 줄입니다.
  3. 성능 최적화: 객체의 생존 기간에 따라 적절한 GC 알고리즘을 적용함으로써 전체 GC 성능을 최적화합니다.

G1 Garbage Collection

 

Java 7에서 도입되고 Java 9부터 기본 GC로 사용되는 GC 알고리즘입니다.

  1. Region 기반: Heap을 여러 Region으로 나누어 관리합니다. 각 Region은 Young Generation 또는 Old Generation으로 사용될 수 있습니다.
  2. 예측 가능한 일시 정지 시간: G1 GC는 일시 정지 시간을 예측 가능하도록 설계되어 있습니다. 이를 통해 실시간 애플리케이션에 적합합니다.
  3. 병렬 및 동시 처리: G1 GC는 병렬 및 동시 처리 방식을 사용하여 GC 성능을 최적화합니다.

 

 

 

 

 

 

 

출처: https://inpa.tistory.com/entry/JAVA-☕-가비지-컬렉션GC-동작-원리-알고리즘-💯-총정리 [Inpa Dev 👨‍💻:티스토리]