가비지 컬렉션(Garbage Collection) 기능 및 동작

dO_the_Jeegu·2023년 1월 12일
0

코드스쿼드 CS16

목록 보기
2/3

1. 가비지 컬렉션(Garbage Collection)이란?

: 여기서 가비지(Garbage)란 참조되지 않은 객체, 즉 사용하지 않는 객체를 의미한다. 가비지 컬렉션은 프로그램이 동적으로 할당했던 메모리 영역(=힙영역) 내에서 더이상 참조되지 않는 메모리 객체를 모아 제거하는 메모리 관리 기법이다.

✍ 이러한 가비지 컬렉션 기능을 수행하는 것이 가비지 컬렉터(Garbage Collector)며, 자바에서는 가비지 컬렉터가 자동으로 GC(Garbage Collection)를 수행한다.


2. 가비지 컬렉션 설계 배경

: 가비지 컬렉션은 약한 세대 가설(Weak Generational Hypothesis)을 기반으로 설계. 약한 세대 가설의 내용은 다음과 같다.

(1) 대부분의 객체는 금방 접근 불가능(Unreachable)한 상태가 된다.

  • 대부분의 객체는 중괄호'{}' 안에서 생성되며 이 객체들은 괄호가 끝나는 시점에서 더이상 사용되지 않는다. 특수한 경우를 제외한 대부분의 경우 Unreachable한 상태가 되어 GC의 대상이 된다.

(2) 오래된 객체에서 최신 객체로의 참조는 매우 적게 발생한다.

  • 일반적으로 순차적인 로직에 의해 객체를 생성하여 활용한다. 이 과정에서 앞에 생성된 객체는 그 다음 로직에서 사용된 이후 대부분 사용되지 않는다. 이런 특성으로 인해 더이상 참조되지 않는 객체에 대해 GC가 가능하다.

3. 힙 구조와 가비지 컬렉션 구성


(1) Young Generation

  • Eden Space : 새로운 객체가 생성되는 곳. Eden 영역이 가득차게 되면 Minor GC가 동작하며 살아남은 객체(아직 참조되고 있는 객체)는 Survivor 영역으로 이동하고 unreachable된 객체는 제거된다.
  • Survivor : Eden 영역에서 넘어온 객체들을 저장하는 공간. Survivor 공간 두 개 중 하나는 항상 비어있어야 한다. Survivor0이 가득 차면 Minor GC가 동작하여 Survivor0에 있던 객체 중 살아남은 객체는 Survivor1으로 이동한다.

(2) Old Generation

  • 객체가 Minor GC를 무사히 통과할 때마다 Count가 1씩 증가하는데, 그 수가 일정 횟수(N번)에 도달한 객체는 Old Generation으로 이동한다. 이 과정을 Promotion이라고 부른다. Old 영역에서 메모리가 가득차게 되면 Major GC가 발생한다.

    ✋ Full GC란?

    ▶ Minor GC + Major GC로, 전영역에서 GC가 동작하는 것.

    ✋ Full GC 발생 상황

    ▶ System.gc()를 직접 호출 시
    ▶ Promotion Failure 발생 시


4. 가비지 컬렉션 과정

(1) 맨 처음 객체가 생성되면 Eden 영역에 객체 생성
(2) Minor GC가 발생하면 미사용 객체를 제거, 아직 사용되고 있는 객체는 Survivor 영역으로 이동시킴


  • 만약 이동해야 할 객체가 Survivor0의 여유 공간보다 크면 Survivor1 영역으로 이동.

(3) 위 과정을 반복하다 객체의 카운팅이 일정 횟수(N번)에 도달하면 Old generation으로 이동


(4) Old Generation이 가득차면 Major GC가 실행되어 Old Generation에 존재하는 모든 객체를 제거

Stop The World(STW)란?
   : GC를 제외한 JVM의 모든 스레드가 잠시 멈추는 현상. 사실상 어떤 GC든 STW가 발생하지만, Minor GC는 비교적 적은 객체를 검사하기 때문에 속도가 매우 빨라 애플리케이션에 거의 영향을 주지 않는다. 반면 Major GC/Full Gc는 많은 객체를 검사해야하기 때문에 시간이 오래 걸린다.
⇒ 일반적으로 Major/Full GC가 일어났을 때 STW 현상이 발생한다고 말한다.


참고영상

profile
오지는 갓생 살기

0개의 댓글