Garbage Collector

유경우·2024년 3월 11일
0

CS

목록 보기
15/21
post-thumbnail
post-custom-banner

들어가기 전

가비지 컬렉션(GC)은 JVM의 힙 영역에서 더 이상 사용되지 않는 객체들을 자동으로 식별하고 제거하는 프로세스입니다.
이는 자바와 같은 언어에서 메모리 관리를 자동화하여 프로그래머가 수동으로 메모리를 할당하고 해제하는 데 드는 노력을 줄여줍니다.
가비지 컬렉션의 존재는 개발자가 메모리 누수와 같은 문제에 덜 신경 쓰게 하여, 개발에 더 집중할 수 있게 합니다.

GC의 단점으로는 메모리가 언제 해제될지 정확히 예측할 수 없고, GC 작업 동안 프로그램의 실행이 일시적으로 멈추는 'Stop-The-World' 현상이 발생할 수 있다는 점입니다.
이 현상은 프로그램의 성능 저하로 이어질 수 있으며, 특히 실시간 처리가 중요한 애플리케이션에서는 문제가 될 수 있습니다.
이러한 문제를 최소화하기 위해 GC 튜닝이 필요할 수 있습니다.

가비지 컬렉션은 자바뿐만 아니라 파이썬, 자바스크립트, Go 언어 등 다양한 프로그래밍 언어에서 구현되어 있으며, 각 언어의 특성에 맞게 조정됩니다.

가비지 컬렉션의 대상 식별 방법

가비지 컬렉션(GC)은 자바에서 객체의 메모리 관리를 자동으로 처리하는 프로세스로, 도달 가능성(Reachability) 개념을 기반으로 메모리에서 더 이상 사용되지 않는 객체를 식별하고 제거합니다.

객체에 대한 유효한 참조가 존재하면 객체는 도달 가능(Reachable) 상태로 간주되어 GC의 대상이 되지 않습니다.
반면, 어떤 참조도 가리키지 않는 객체는 도달 불가능(Unreachable) 상태로 분류되어 가비지 컬렉션에 의해 메모리에서 제거됩니다.

이 과정은 JVM의 힙 영역 내에서 객체들이 생성되고 참조되는 방식에 따라 결정되며, 필요 없어진 객체들이 자동으로 정리됨으로써 메모리 효율성을 유지할 수 있게 돕습니다.

가비지 컬렉션의 청소 방식: Mark and Sweep

가비지 컬렉션의 청소 방식으로 널리 사용되는 "Mark and Sweep" 방법은 가비지 컬렉션이 진행되는 기본적인 과정입니다.

이 방식은 가비지 컬렉터가 먼저 메모리에서 사용되고 있는 객체들을 식별하고(Mark) 마킹한 다음, 참조되지 않은 객체들, 즉 Unreachable 객체들을 메모리에서 제거(Sweep)합니다.
이후, 메모리 내에서 객체가 제거됨으로써 발생하는 파편화된 공간을 정리하는 압축(Compaction) 작업을 수행할 수 있습니다.

이 과정을 통해 메모리 사용 효율성을 높이고, 필요하지 않은 객체들을 효과적으로 제거하여 시스템의 성능을 유지할 수 있습니다.

가비지 컬렉션의 작동 과정과 힙 메모리 구조

가비지 컬렉션(GC)은 JVM의 힙(heap) 영역에서 사용되지 않게 된 객체를 정리하는 프로세스입니다.
힙 영역은 동적으로 할당된 데이터가 저장되는 곳으로, GC의 대상이 되며, 크게 Young Generation과 Old Generation 두 부분으로 나뉩니다.

Young Generation은 새롭게 생성된 객체가 할당되는 곳으로 대부분의 객체가 여기서 생성되었다가 비교적 빠르게 소멸됩니다.

반면, Old Generation은 Young Generation에서 살아남은 객체가 이동하는 곳으로, 여기에 할당된 객체들은 더 긴 생명주기를 가집니다.

Minor GC 과정

  1. 새로 생성된 모든 객체는 Young Generation의 Eden 영역에 위치합니다.
  2. Eden 영역이 가득 차면, Minor GC가 발생하여 살아남은 객체들은 Survivor 영역으로 이동합니다.
  3. 이 과정을 반복하면서 객체가 살아남을 때마다 객체의 age가 증가하며, 특정 임계값을 넘으면 Old Generation으로 이동(promotion)합니다.

Major GC 과정

  1. Old Generation의 메모리가 부족해지면 Major GC가 발생합니다.
  2. 이 과정에서 사용되지 않는 객체들을 제거하여 메모리를 확보합니다.

이러한 GC 과정은 메모리 사용 효율성을 높이고, 시스템의 성능을 유지하는 데 중요한 역할을 합니다.

Young Generation에서는 객체의 생명주기가 짧기 때문에 Minor GC가 빈번하게 발생하지만, 처리 시간이 짧습니다.
반면, Old Generation에서 발생하는 Major GC는 더 긴 시간이 소요될 수 있으며, 애플리케이션의 성능에 영향을 줄 수 있습니다.

따라서, GC 최적화는 애플리케이션의 성능 관리에 있어 중요한 고려사항입니다.

가비지 컬렉션 알고리즘의 다양성

가비지 컬렉션(GC) 알고리즘은 JVM(자바 가상 머신)에서 메모리 관리를 최적화하기 위해 발전해왔습니다.
서로 다른 상황과 요구 사항에 맞춰 다양한 GC 알고리즘들이 개발되었으며, 이들은 효율적인 메모리 사용과 시스템 성능 향상을 목표로 합니다.

주요 GC 알고리즘 종류에는 다음과 같은 것들이 있습니다.

  1. Serial Garbage Collector: 단일 스레드 환경에 최적화되어 있으며, GC 작업 시 애플리케이션의 모든 작업을 중지합니다. 간단한 애플리케이션 또는 제한된 리소스를 가진 환경에 적합합니다.

  2. Parallel Garbage Collector: 병렬 처리를 통해 GC 작업을 수행하는 알고리즘으로, 멀티프로세서 환경에서 높은 처리량(Throughput)을 제공합니다. 주로 서버 애플리케이션에 사용됩니다.

  3. CMS (Concurrent Mark Sweep) Garbage Collector: 애플리케이션의 중단 시간을 최소화하기 위해 설계되었습니다. CMS는 가비지 컬렉션 작업을 애플리케이션 스레드와 병행하여 실행함으로써 응답 시간이 중요한 애플리케이션에 유용합니다.

  4. G1 (Garbage-First) Garbage Collector: 큰 힙 메모리를 관리하고 짧은 중단 시간을 유지하도록 설계된 최신 GC 알고리즘입니다. 메모리를 여러 영역으로 나누어 관리하며, GC가 필요한 영역부터 우선적으로 처리합니다.

  5. ZGC (Z Garbage Collector) 및 Shenandoah GC: 저지연(low-latency)을 목표로 하는 가장 최신의 GC 알고리즘입니다. 이들은 매우 큰 힙 크기와 멀티프로세서 환경에서도 일관된 낮은 중단 시간을 제공하도록 설계되었습니다.

각각의 GC 알고리즘은 특정 환경과 요구 사항에 맞춰 선택적으로 사용될 수 있으며, JDK 버전이나 애플리케이션의 특성에 따라 적합한 GC 알고리즘을 적용하여 시스템의 성능을 최적화할 수 있습니다.

출처 : 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
https://sihyung92.oopy.io/java/garbage-collect/1
https://mangkyu.tistory.com/118

profile
개발자
post-custom-banner

0개의 댓글