[Java] 가비지 컬렉션 (GC)

may_yun·2023년 4월 10일
0

JAVA

목록 보기
11/12
post-custom-banner

1. Garbage Collection 이란?

JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스이다.

프로그램 개발중 유효하지 않은 메모리(Garbage)가 발생하는데
Java의 경우 JVM의 가바지 컬렉터가 불필요한 메모리을 알아서 정리해 주기 때문에 개발자가 메모리를 직접 해제해주는 일이 없다.
(java에서는 명시적으로 불필요한 데이터를 표현하기 위해서 null을 선언해준다)

  • 메모리 누수를 방지하기 위해 가비지 컬렉터(Garbage Collector, GC)가 주기적으로 검사하여 메모리를 청소해준다.
  • Java에서도 System.gc()를 이용해 호출할 수 있지만, 해당 메소드를 호출하는 것은 시스템의 성능에 매우 큰 영향을 미치므로 절대 호출해서는 안된다.
Person person = new Person();
person.setName("Mang");
person = null;

// 가비지 발생
person = new Person();
person.setName("MangKyu");

1-1) GC의 대표적인 문제점

  • 개발자가 메모리가 언제 해제되었는지 정확하게 알 수 없다.
  • 가비지 컬렉션(GC) 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
  • GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다.

2. Heap영역 GC

JVM의 Heap영역은 처음 설계될 때 다음의 2가지를 전제(Weak Generational Hypothesis)로 설계되었다.

  • 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
  • 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
    📌 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다
  • 참조하는 변수가 사라진다면 이 객체는 필요없는 것으로 간주하고 Garbage Collector에 의해서 할당이 해제 (이러한 객체들을 Unreachable하다고 하며 주기적으로 가비지 컬렉터가 제거해줍니다.)

: 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누었고, Young, Old 2가지 영역으로 설계되었다. 초기에는 Perm 영역이 존재했지만 Java8부터 제거되었다

Minor GC

Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.

  • 새로 생성된 대부분의 객체는 Eden 영역에 위치
  • Eden 영역에서 GC가 한번 발생한 뒤 살아남은 객체는 Survivor 영역중 하나로 이동된다
    이 과정을 반복하고 계속 살아남은 객체는 일정시간 참조되고 있다는 뜻으로 Old 영역으로 이동

Major GC

Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.

  • Old 영역의 객체들을 검사해서 참조되지 않은 객체들을 한번에 삭제
  • 시간이 오래 걸리고 실행 중 프로세스가 중단된다(stop-the-world)
    (Major GC가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 중단되며 완료 후 다시 작업 시작)
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
    (Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않으며 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당되기 때문이다)

가비지 컬렉션 소멸 대상 선정 방법

객체가 Garbage인지를 판단하기 위해 reachability라는 개념을 사용한다.
어떠한 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability, 없다면 unreachability로 판단.

  • 최초에 참조한 것을 Root Set이라고 칭한다.
  • GC의 실행 타이밍은 별도의 알고리즘을 기반으로 계산되며 이 결과를 기반으로 GC 실행.


참고

profile
개발 일지
post-custom-banner

0개의 댓글