CS Study 10주차: [Java] 가비지 컬렉션(Garbage Collection)

hjern·2024년 5월 5일
0

CS Study

목록 보기
9/10

Garbage Collection

자바 언어의 큰 장점은 C/C++ 언어와 달리 개발자가 명시적으로 객체를 해체할 필요가 없다. 메모리에서 사용하지 않는 객체를 삭제하는 작업을 가비지 컬렉션(GC)라고 부르며 자바 가상 머신(JVM)이 GC를 수행한다.

JVM의 메모리는 총 5가지(Method, Heap, Stacks, Native method stacks, PC)로 나뉘며, GC는 Heap 메모리만 다룬다.

일반적으로 다음과 같은 경우에 GC의 대상이 된다.

  1. 객체가 NULL인 경우 (ex. String str = null)
  2. 블럭 실행 종료 후, 블럭 안에서 생성된 객체
  3. 부모 객체가 NULL인 경우, 포함하는 자식 객체

GC는 Weak Generational Hypothesis 에 기반한다.

대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

GC의 메모리 해제 과정에 대해 살펴보자.

GC의 메모리 해제 과정

1. Marking


프로세스가 마킹을 호출하며, 이는 메모리가 사용되는지 아닌지를 GC가 찾아내는 과정이다. 참조되는 객체는 파란색으로, 참조되지 않는 객체는 주황색으로 보여지며 모든 오브젝트는 마킹 단계에서 결정을 위해 스캔된다. 모든 오브젝트를 스캔하기 때문에 매우 많은 시간을 소모한다.

2. Nomal Deletion


참조되지 않는 객체를 제거하고, 메모리를 반환한다. 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해 두었다고 새로운 오브젝트가 선언되면 할당되도록 한다.

3. Compacting


퍼포먼스를 향상시키기 위해, 참조되지 않는 객체를 제거하고 남은, 참조중인 객체들을 묶는다. 이들을 묶음으로서 공간이 생기므로 새로운 메모리 할당 시에 더 쉽고 빠르게 진행할 수 있다.

Generational Garbage Collection 배경

모든 객체를 Mark & Compact 하는 JVM은 비효율적이다.

보다시피 시간이 갈수록 적은 객체만 남는다. 위와 같은 그래프에 기반한 것이 Weak Generational Hypothesis 이다. 이 가설에 기반하여 JAVA는 Young 영역과 Old 영역으로 메모리를 분할하고, 신규로 생성되는 객체는 Young 영역에 보관하며, 오랫동안 살아남은 객체는 Old 영역에 보관한다.

Generational Gabage Collection

Young 영역(Yong Generation 영역)

생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다. 여기서 일어나는 가비지 콜렉트를 Minor GC 라고 한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.

Eden : 객체들이 최초로 생성되는 공간
Survivor 0, 1 : Eden에서 참조되는 객체들이 저장되는 공간
💡 Eden 영역에 객체가 가득차게 되면 첫번째 GC가 발생한다. Eden영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 객체를 삭제한다.

Old 영역(Old Generation 영역)

접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생하며, 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC) 가 발생한다고 말한다.

Permanent 영역

Method Area라고도 하며 JVM이 클래스들과 메소드들을 설명하기 위해 필요한 메타데이터들을 포함하고 있다. JDK8부터는 PermGen은 Metaspace로 교체되었다.

Generational Garbage Collection 과정

  1. 어떠한 새로운 객체가 들어오면 Eden Space에 할당된다.
  2. Eden space가 가득차게 되면, minor garbage collection이 시작된다.
  3. 참조되는 객체들은 첫 번째 survivor(S0)로 이동하고, 비 참조 객체는 Eden space가 clear 될 때 반환된다.
  4. 다음 minor GC 때, Eden space에서 동일하게 비참조 객체는 삭제되고 참조 객체는 survivor space로 이동한다. 그러나 이 케이스에서 참조 객체는 두 번째 survivor space로 이동하며, 직전 minor GC에서 첫 번째 survivor space로 이동된 객체들도 age가 증가하고 S1 공간으로 이동한다. 한번 모든 surviving 객체들이 S1으로 이동하게 되면 S0와 Eden 공간은 Clear 된다. 주의해야할 점은 다른 aged 객체들끼리 서바이버 공간을 공유하고 있다는 사실이다.
  5. 다음 minor GC 때, 같은 과정이 반복되지만 이번엔 survivor space 끼리 switch 된다. 즉, 참조중인 객체들이 S0로 이동하며 살아남은 객체들은 aged 된다. 그리고 Eden과 S1 공간은 Clear 됩니다.
  6. minor GC 후 aged 오브젝트들이 일정한 age threshold(문지방) 을 넘게 되면 그들은 young generation 에서 old 로 promotion 되어집니다. 여기서는 8을 예로 들었다.
  7. minor GC가 계속되고 계속해서 객체들이 Old Generation으로 이동한다.
  8. 결국 major GC가 old Generation에 시행되고, old Generation은 Clear 되고, 공간이 Compact 된다.


    참고자료

    Garbage Collection
profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글