m1ndy5's coding blog

Garbage Collector 본문

CS Study

Garbage Collector

정민됴 2024. 3. 7. 10:00

Garbage Collector

가비지 컬렉터는 메모리 관리를 자동으로 처리하는 JVM의 구성 요소 중 하나이다.

가비지 컬렉터의 주된 역할은 Heap 영역에서 사용하지 않는 객체를 찾고 자동으로 메모리에서 해제하여 시스템 자원을 효율적으로 관리하는 것이다.

 

가비지 컬렉터의 역할

1. 가비지 식별 : 가비지 컬렉터는 더 이상 참조되지 않는 개체를 식별한다. 객체가 어떠한 참조에도 도달하지 않는 경우, 해당 객체는 가비지로 간주된다.

2. 가비지 수거 : 가비지 컬렉터는 식별된 가비지 객체들을 메모리에서 수거(삭제)한다. 이러한 프로세스를 통해 메모리 누수를 방지하고 프로그래머가 명시적으로 메모리를 관리하지 않아도 된다.

 

가바지 컬렉터의 원리

1. 참조 추적 : 대부분의 가비지 컬렉터는 참조 추적 알고리즘을 사용하여 객체 간의 참조 관계를 추적한다. 루트 객체(주로 전역 변수, 스택, 레지스터 등)에서 시작하여 참조되는 모든 객체를 추적하고, 도달할 수 없는 객체를 가비지로 표시한다.

2. 메모리 해제 : 가비지로 표시된 객체들은 메모리에서 해제된다. 이때, 자바의 가상 머신은 자동 메모리 관리를 위해 가비지 컬렉션을 주기적으로 실행하거나 프로그램이 일시 정지되는 동안 실행할 수 있다.

 

가비지 컬렉터 알고리즘

1. 표시-정리 알고리즘(Mark-Sweep) : 가장 기본적인 알고리즘으로 먼저 참조되는 모든 객체를 표시하고, 그 후에 표시되지 않은 객체들을 메모리에서 해제한다. 단점으로는 메모리 단편화가 발생할 수 있다.

-> 삭제된 객체의 메모리 공간이 연속적이지 않아서 크기가 큰 객체를 할당할 때 메모리 할당에 어려움이 있을 수 있지만 Compact 과정을 거쳐 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다.

 

2. 세대별 가비지 컬렉션(Generation Garbage Collection) : 객체의 수명을 세대로 나누어 관리하는 것, Young 영역과 Old 영역으로 나뉜다.

- Young 영역 : 새롭게 객체가 할당되는 영역, 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다.

- Old 영역 : Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역, Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다. 이 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.

 

Old 영역이 Young 영역보다 크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않고, 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당되기 때문이다.

전반적으로 Minor GC가 더 자주 발생하고 Major GC는 Old 영역의 메모리가 부족해질 때 일어나서 상대적으로 덜 자주 발생하지만 Major GC는 시스템의 전반적인 일시 중지를 발생시키므로 주의가 필요하다.

 

따라서 이러한 Stop the World 문제가 발생하는 것을 개선하기 위해 다양한 Garbage Collection 알고리즘이 개발 되었다.

  1. Concurrent Mark-Sweep (CMS):
    • 원리: CMS 가비지 컬렉션은 메모리를 세대로 나누고, young generation은 병렬로 수행하면서 old generation은 병행적으로(non-blocking) 수행한다.
    • 장점: 일시 중지 시간을 최소화하여 Stop-the-World 시간을 줄인다.
    • 단점: 메모리 파편화이 발생할 수 있고, 처리량이 증가할 때 예측할 수 없는 일시 중지가 발생할 수 있다.
    • Java 14에서 사용이 중지됐다.
  2. Garbage-First (G1) Garbage Collection:
    • 원리: G1 가비지 컬렉션은 힙을 더 작은 영역(Regoin)으로 나누고, 이 영역들 간의 가비지 컬렉션을 병렬로 수행합니다. 가장 먼저 가비지 컬렉션을 해야 할 영역을 선정하는 방식으로 동작한다.
    • 장점: Stop-the-World 시간을 예측 가능하게 줄이고, 힙을 더 세분화하여 효율적으로 가비지 컬렉션을 수행한다.
    • 단점: 몇몇 특정 상황에서 처리량이 감소할 수 있다.
    • Java 9+ 버전의 디폴트 GC이다.
  3. Shenandoah Garbage Collection:
    • 원리: Shenandoah는 병렬 및 병행적인 방식을 통해 최소한의 일시 중지 시간으로 가비지 컬렉션을 수행한다. 또한, 힙 영역을 더 작은 단위로 나누어 처리한다.
    • 장점: 일시 중지 시간을 매우 짧게 유지하면서도 전반적인 처리량을 유지할 수 있다.
    • 단점: 일부 애플리케이션에 대한 최적화가 필요할 수 있으며, 모든 플랫폼에서 지원되지 않을 수 있다.
    • Java 12에 릴리즈됐다.
  4. Z Garbage Collector(ZGC)
    • 원리: ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 ZPage는 2mb 배수로 동적 운영한다.(큰 객체가 들어오면 2^로 영역을 구성해 처리)
    • 장점: 힙 크기가 증가하더라도 'stop-the-world'의 시간이 10ms를 넘지 않는다.
    • 단점: 일부 응용 프로그램에서는 ZGC가 다른 가비지 컬렉터보다 성능이 떨어질 수도 있고 메모리 사용량이 더 클 수 있지만 일반적으로는 성능 및 일시 중지 시간 측면에서 우수한 결과를 보이는 편이다.
    • Java 15에 릴리즈됐다.

G1 GC
Shenandoah GC
ZGC

 

참고 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC#recentEntries

'CS Study' 카테고리의 다른 글

JPA의 동작원리  (1) 2024.03.13
Java의 메모리 영역  (0) 2024.03.07
JVM, JRE, JDK & 자바 프로그램의 실행 과정  (0) 2024.03.07
영속성 컨텍스트  (0) 2024.03.06
JPA 도입 시 고려해 볼 사항  (0) 2024.03.06