Back_End/JAVA

자바의 가비지 컬렉터 (Garbage Collector) 🗑️

10Biliion 2024. 12. 18. 17:59

 

 

 

자바의 가비지 컬렉터(Garbage Collector, GC)는 불필요한 메모리를 자동으로 관리하여 개발자가 직접 메모리를 할당하거나 해제하지 않아도 되도록 도와줍니다. 이는 자바가 가진 가장 큰 장점 중 하나로, 메모리 누수를 방지하고 안정성을 높여줍니다.


1. 가비지 컬렉터의 동작 원리

가비지 컬렉터는 **힙 메모리(Heap Memory)**에서 사용되지 않는 객체를 탐지하고, 이를 제거하여 메모리를 회수합니다.

메모리 영역 구분

자바 프로그램의 메모리는 크게 다음과 같이 구분됩니다:

  1. 메서드 영역(Method Area): 클래스 정보, 상수, static 변수 등이 저장.
  2. 스택 영역(Stack Area): 메서드 호출 시 생성되는 지역 변수와 호출 스택 저장.
  3. 힙 영역(Heap Area): 객체와 동적으로 할당된 데이터 저장. 가비지 컬렉터가 관리하는 영역.

2. 객체가 가비지가 되는 조건

다음과 같은 상황에서 객체는 "가비지"로 간주됩니다:

  1. 더 이상 참조되지 않는 객체
  2. public class GarbageExample { public static void main(String[] args) { String str = new String("Hello"); str = null; // "Hello" 객체는 더 이상 참조되지 않음 } }
  3. 순환 참조 (Circular Reference)
    • 서로 참조하는 객체라도 외부에서 접근할 수 없는 경우 가비지로 간주됩니다.
    class Node {
        Node next;
    }
    
    public class CircularReference {
        public static void main(String[] args) {
            Node n1 = new Node();
            Node n2 = new Node();
            n1.next = n2;
            n2.next = n1;
            // n1과 n2는 순환 참조 중이나 외부에서 접근 불가 시 가비지로 처리
        }
    }

3. 가비지 컬렉터의 종류

1) Serial GC

  • 단일 스레드에서 동작.
  • 작은 애플리케이션에 적합.
  • JVM 옵션: -XX:+UseSerialGC

2) Parallel GC

  • 멀티 스레드로 처리하여 속도 향상.
  • 대규모 애플리케이션에 적합.
  • JVM 옵션: -XX:+UseParallelGC

3) CMS (Concurrent Mark-Sweep) GC

  • 애플리케이션의 멈춤 시간을 줄이기 위해 병렬 처리를 사용.
  • 낮은 지연 시간이 중요한 시스템에 적합.
  • JVM 옵션: -XX:+UseConcMarkSweepGC

4) G1 (Garbage First) GC

  • 자바 9 이상에서 기본 가비지 컬렉터.
  • 효율적인 메모리 관리와 짧은 멈춤 시간 제공.
  • JVM 옵션: -XX:+UseG1GC

4. GC의 주요 동작 과정 

1) Mark 단계

  • 사용 중인 객체를 식별.

2) Sweep 단계

  • 사용되지 않는 객체를 제거하여 메모리를 회수.

3) Compact 단계 (선택적)

  • 메모리를 정리하여 단편화를 방지.

5. GC 동작 확인하기

GC가 어떻게 동작하는지 확인하려면 다음 JVM 옵션을 사용할 수 있습니다:

  • -XX:+PrintGC: GC 동작 로그 출력
  • -XX:+PrintGCDetails: 상세한 GC 동작 로그 출력
  • -XX:+PrintGCTimeStamps: GC 동작 시간 표시

실행 예제

java -XX:+PrintGC -XX:+PrintGCDetails MyApplication

로그 예시:

[GC (Allocation Failure)  512K->256K(1024K), 0.0024 secs]
  • 512K->256K: 힙 메모리 사용량 변화
  • 0.0024 secs: GC 수행 시간

6. 가비지 컬렉션 튜닝

GC는 대부분의 경우 JVM이 자동으로 최적화하지만, 애플리케이션의 요구 사항에 따라 튜닝할 수 있습니다. 몇 가지 팁:

  1. JVM 옵션을 활용:
    • -Xms: 초기 힙 크기 설정
    • -Xmx: 최대 힙 크기 설정
  2. GC 유형 선택:
    • 지연 시간이 중요한 경우 G1 GC 추천.
    • 처리량이 중요한 경우 Parallel GC 추천.
  3. 메모리 누수 방지:
    • 불필요한 객체 참조 제거.
    • WeakReference 사용.

 

 

Q1. 가비지 컬렉터가 객체를 즉시 삭제하나요?

A. 아니요. GC는 JVM이 적절하다고 판단했을 때 동작합니다.

Q2. finalize() 메서드란?

A. 객체가 삭제되기 전에 호출되는 메서드로, 더 이상 권장되지 않습니다. 대신 try-with-resources를 사용하는 것이 좋습니다.

Q3. GC 동작이 느리다면 어떻게 해결할 수 있나요?

A. GC 튜닝, 힙 크기 조정, 적합한 GC 유형 선택으로 최적화할 수 있습니다.