2 minute read

  • 자바는 JVM이 구성된 JRE가 제공되며, 그 안에 Garbage Colledction이 포함된다.
  • GC로 인해 개발자는 프로그램 코드에서 직접 메모리 누수를 방지하기 위해 직접 사용하지 않는 객체의 메모리를 해제하지 않아도 된다.
  • 그렇지만 GC의 기본적인 동작 방식을 이해하는 것은 중요하다고 생각한다.

stop-the-world

  • stop-the-world란 GC가 실행되기 전에 JVM이 애플리케이션의 실행을 멈추는 것이다. 어떤 GC 구현체를 사용하더라도 stop-the-world가 발생하게 된다.

JVM의 메모리 영역은 크게 5가지 영역으로 나뉜다.

  1. class
  2. stack
  3. heap
  4. native method
  5. PC

    이 중 GC는 heap 영역을 대상으로 작업을 진행한다.

GC의 대상이 되는 경우

  • 객체가 NULL인 경우
  • 불럭 실행 종료 후에 해당 블럭 안에서 생성된 객체
  • 부모 객체가 NULL인 경우 포함하는 자식 객체의 경우

GC의 memory deletion

  • Marking
    • 프로세스는 참조되는 객체와 참조되지 않는 객체를 구별하기 위해 스캐닝하는 과정을 거친다.
    • 해당 방식은 모든 객체를 스캔하기 때문에 많은 시간을 소모한다.
  • Normal Deletion
    • 스캔을 통해 모든 객체의 사용 유무(참조)를 파악했기 때문에, 참조되지 않는 객체를 제거하고 메모리를 반환한다.
  • Compacting
    • 참조되지 않는 객체를 제거하고, 속도 향상을 위해 남은 객체들을 한 군데로 모아주는 Compact를 수행한다. 이는 새로운 메모리 할당 시 속도 향상을 위한 작업이다.

Weak Henrational Hypothesis

  • 새롭게 생성된 객체는 금방 접근 불가능 상태가 된다.
  • 오래된 객체에서 새로 생성된 객체로의 참조는 아주 적게 존재한다.

GC는 위의 두 가지 전제를 토대로 만들어졌다. 위의 두 가지 가설을 살펴보면 객체를 새로 생성된 객체와 생성된 지 오래된 객체로 구분짓는 것을 알 수 있다. 따라서, 이러한 배경을 바탕으로 GC는 객체를 young, old 영역으로 구분하고 신규로 생성된 객체는 young 영역에 저장하고, 오랫동안 참조가 해제되지 않는 객체는 old 영역에 보관한다.

Generation Gabage Collection

  • young 영역
    • 새롭게 생성된 객체들은 young 영역에 저장된다. 많은 객체가 young 영역에 생성되었다가 메모리 해제된다.
    • 이 영역에서 객체가 참조 불가능 상태가 되어 해제되는 경우 “Minor GC”가 발생했다고 한다.
  • old 영역
    • young 영역에서 오랫동안 살아남은 객체는 old 영역에 복사된다. 보통 young 영역보다 크게 할당되며, 크기가 큰 만큼 GC는 적게 발생한다.
    • old 영역에서 GC가 발생한 경우 Major or Full GC라 한다.
  • permanent 영역
    • Method Area라고도 하며, JVM이 class, method의 설명을 위해 필요한 Metadata를 포함학고 있다.

Generational Garbage Collection

위에서 GC는 모든 객체를 스캐닝하는 과정을 거쳐 메모리 해제에 해당하는 객체를 찾는다고 했는데 해당 방식은 많은 시간을 소모한다. 따라서 Generational Garbage Collection 방식이 등장했다.

  1. 새로운 객체가 생성되면 Eden Space에 할당된다.
  2. Eden Space가 가득차면, Minor GC가 시작된다. a. 아직 참조되는 객체들은 survivor(S0)로 이동하고, 비참조 객체들은 Eden Space clear와 같이 반환된다. b. 다시 Eden Space가 가득차서 Minor GC가 발생하면, (a)와 같이 동작한다. 단, 참조 객체는 두번째 survivor Space로 이동한다. 첫 번째 survivor 영역에 객체가 존재한다면 해당 객체들의 age를 증가시키고 S1 공간으로 이동시킨다.
  3. 다음 Minor GC 때도 같은 과정이 반복된다. 그렇지만, survivor Space는 스위치된다.
  4. Minor GC 후 일정 age에 도달한 객체들은 old space로 이동된다.
  5. Major GC는 old generation에서 이뤄지고, old generation은 clear + compact 과정이 발생한다.

Categories:

Updated: