Programming/Java

자바의 가비지 컬렉션

vita12321 2023. 8. 9. 09:00
728x90
반응형

자바의 가비지 컬렉션(Garbage Collection) 프로그램의 메모리 관리를 최적화하는데 중요한 역할을 하는 기능입니다. 글에서는 가비지 컬렉션의 개념, 작동 원리, 자바 가상 머신(JVM)에서 가비지 컬렉션 처리 방식, 알고리즘, 그리고 가비지 컬렉션 최적화를 위한 방법에 대해 상세하게 설명하겠습니다.


 

1. 가비지 컬렉션(Garbage Collection) 개념 작동 원리

 

  • 가비지 컬렉션이란?

가비지 컬렉션은 자바에서 메모리 관리를 담당하는 기술로써, 프로그램에서 이상 사용되지 않는 객체를 메모리에서 자동으로 제거하는 역할을 합니다. 이를 통해 개발자는 명시적으로 메모리를 관리할 필요가 없으며, 메모리 누수 관련된 버그를 줄일 있습니다.

 

  • 작동 원리

가비지 컬렉션은 레퍼런스 카운팅(reference counting) 기반의 알고리즘에서 발전했습니다. 레퍼런스 카운팅은 객체의 참조 횟수를 기록하고, 참조 횟수가 0 되는 즉시 메모리에서 객체를 제거하는 방식입니다. 방식은 간단하긴 하지만, 순환 참조(circular reference) 같은 문제를 해결하기 어려웠습니다.

 

자바에서는 루트 객체(root object) 기반으로 하는 가비지 컬렉터를 사용합니다. 루트 객체는 직접적으로 참조할 있는 객체로, 일반적으로 스택 메모리에 있는 지역 변수 메소드의 매개변수, 레지스터 속의 참조 변수 등입니다. 가비지 컬렉터는 루트 객체로부터 참조되거나 간접적으로 참조되는 객체들의 집합을 구한 , 외의 객체를 메모리에서 제거하여 공간을 확보합니다.


 

2. 자바 가상 머신(JVM)에서의 가비지 컬렉션 처리

 

먼저, 자바의 가상 머신의 메모리 영역에 대해 이해해야 합니다. JVM 내에서 메모리는 크게 Heap 영역과 Stack 영역으로 나뉩니다. 가비지 컬렉션은 영역에서 발생하며, 객체의 생존 여부를 판별한 다음, 사용되지 않는 객체를 해제하여 새로운 객체가 사용할 있는 공간을 확보합니다.

 

  • Heap 영역

영역은 객체가 생성되는 공간입니다. JVM 영역은 부분으로 나뉩니다.

 

  • Young Generation:
    새로 생성된 객체가 할당되는 영역으로, 다시 Eden Space, Survivor Space 0, Survivor Space 1로 구분됩니다. 서로 다른 두 Survivor Space 중 한 곳에서 다른 한 곳으로 객체를 복사해가며 사용되는 객체만 남길 수 있습니다.

  • Old Generation:
    Young Generation에서 살아남은 객체가 이동하는 영역으로, 경험이 풍부한 객체로 여겨집니다.

  • Permanent Generation(Java 8 이하) 또는 Metaspace(Java 8 이상):
    클래스 메타데이터, 메서드 레벨의 정보 등 시스템 자원이 배치되는 영역입니다. Java 8 이후부터 이 영역은 네이티브 메모리에 위치하게 되어 메모리 크기가 동적으로 확장될 수 있게 되었습니다.

 

3. 가비지 컬렉션 알고리즘과 기법

 

최근의 자바는 여러 가지 가비지 컬렉션 알고리즘을 제공하고 있습니다. 주요 가비지 컬렉션 알고리즘은 다음과 같습니다.

  • Parallel GC:
    Young Generation 영역에서 복사 방식을 사용해 가비지 컬렉션을 수행하는 알고리즘입니다. 여러 스레드를 사용해 가비지 컬렉션을 병렬로 처리합니다. Old Generation 영역에서는 Mark-and-Sweep 방식을 사용합니다.

  • Concurrent Mark Sweep (CMS) GC:
    메모리에서 가비지를 수집하는 동안 애플리케이션 실행을 중단하지 않고 병렬적으로 수행되는 알고리즘입니다. 다만, 컴팩션 과정이 없어 메모리 파편화 문제가 발생할 수 있습니다.

  • G1(Garbage-First) GC:
    메모리를 여러 개의 작은 영역으로 나누고, 가비지가 가장 많이 쌓여 있는 영역을 우선적으로 처리하는 알고리즘입니다. Parallel GC와 CMS GC의 장점을 접목한 방식으로, 메모리 파편화 문제를 해결하면서도 애플리케이션의 중단 시간을 최소화합니다.

 

4. 가비지 컬렉션 최적화

 

가비지 컬렉션 최적화를 위해 고려할 있는 가지 방법은 다음과 같습니다.

  • 가급적 적은 수의 가비지를 생성하도록 프로그래밍하며, 객체 풀링(Object Pooling) 등의 기법을 활용합니다.
  • 필요하지 않은 객체 참조를 빠른 시일 내에 제거합니다(null 처리).
  • JVM의 힙 크기 및 여러 메모리 영역의 설정을 변경하여 가비지 컬렉션의 동작 방식을 조절할 수 있습니다.
  • 가비지 컬렉션 로그를 분석하여 문제를 찾고, 가비지 컬렉터를 변경하거나 설정을 변경하여 성능을 개선할 수 있습니다.

 

 

가비지 컬렉션 기술은 자바 프로그램의 메모리 관리 성능 향상을 이끕니다. 그러나 최적의 성능을 발휘하기 위해서는 개발자가 기술의 작동 원리와 최적화 방법에 대해 이해하고 적용해야 합니다. 가비지 컬렉션 동작 방식, 프로그래밍 패턴 최적화 전략을 연구하여 프로젝트에 적용하고, 메모리 관리와 성능 개선에 기여하세요.

728x90
반응형