JAVA - Garbage Collection(가비지 컬렉션)

목차

JAVA - Garbage Collection(가비지 컬렉션)

동적 할당 받은 메모리 중에서 사용하지 않는 메모리를 해제해 메모리 누수를 막는 메모리 관리 기법

  • memory leak 을 없앨 수 있다.

GC Root가 될 수 있는 대상들

  • Stack 영역의 데이터
  • Static 데이터
  • JNI에 의해 생성된 객체들

Mark And Sweep 알고리즘

참조가 유효한 Object를 Reachable 참조가 유효하지 않은 Object를 Unreachable 이라고 부른다.

  • Mark
    • GC Root로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹하는 과정
    • Mark 과정에서 Reachable 한 객체와 Unreachable 한 객체를 스캔한다
  • Sweep
    • Unreachable한 객체를 Heap 에서 제거하는 과정
  • Compact
    • Sweep 후 분산된 객체들을 모아 메모리 단편화 가 이뤄지는 것을 막아준다.

Garbage Collection 작동 방식

Grabage Collection 은 크게 New Generation 에서 일어나는 Minor GC 와 Old Generation 에서 일어나는 Major GC 가 있다.

  • Eden 영역에 새로운 객체 가 할당된다.
  • Eden 영역이 가득 차게 되면 Gabage Collection 이 발생한다. (Minor GC)
    • 살아 있는 객체는 Survivor 0 영역으로 이동한다. (Age 값이 증가한다.)
    • Unreachable 한 객체는 사라진다.
  • 또 다시 Eden 영역이 가득차게되면 Eden 영역과 Survivor 0 영역을 대상으로 Gabage Collection 이 발생한다.
    • 살아 있는 객체는 Survivor 1 영역으로 이동하게 된다.
    • 두 Survivor 공간 중 하나는 항상 비어 있어야 한다.
    • 한 객체가 양쪽 Survivor 영역에 존재해서는 안된다.
  • 특정 Age 값을 넘어가게 되면 Old Generation 으로 넘어가게 된다 (Promoted)
  • Old Generation 영역이 가득차게 되면 Gabage Collection 이 발생한다 (Major GC)

Heap 영역

Gabage Collection 종류

GC 는 크게 Young Generation 에서 발생하는 Minor GC 와 Old Generation 에서 발생하는 Major GC 두가지 타입으로 나뉜다.

Stop the world

Gabage Collection이 일어나는 동안 JVM 어플리케이션 실행이 멈추는 것 , GC를 실행하는 Thread 외 모든 Thread는 작업을 정지한다.

Serial GC

CPU 코어가 하나일 경우 사용하기 위한 방식으로 GC를 실행하는 Thread 가 하나다.

  • 운영에서 절대 사용하면 안되는 GC
  • Stop the world 시간이 다른 GC에 비해 길다.
  • Mark & Sweep & Compact 알고리즘을 사용

Paralle GC

여러개의 Thread를 이용해 GC를 처리한다.

  • Young 영역의 GC는 멀티 스레드 방식을 사용하기 때문에 Serial GC 에 비해 Stop The World 가 짧다.
  • Java 8의 Default GC

Concurrent Mark And Sweep(CMS) GC

Stop the Wolrd 로 Application이 멈추는 현상을 줄이기 위해 만들어진 GC
Initial Mark , Concurrent Mark , Remark , Concurrent Sweep 의 4가지 과정이 있다.

  • Initial Mark
    • GC Root가 참조하는 객체만을 마킹한다.
    • Stop the World 가 발생한다.
  • Concurrent Mark
    • GC 대상의 객체가 참조하는 다른 객체들을 찾아 다니면서 추가적인 GC 대상을 마킹한다.
  • Remark
    • Concurrent Mark 단계를 검즌하는 과정
    • GC 대상이 추가적으로 확인 됐거나 참조가 제거 됐는지 등 확인한다.
    • Stop The World 가 발생한다.
  • Concurrent Sweep
    • GC 대상을 삭제하는 과정

G1 GC

Heap 영역을 여러개의 Region으로 나누고 각 Region 에서 Young Gen 과 Old Gen 을 유동적으로 사용하는 GC

  • 전체 Heap 을 탐색하는 것이 아닌 Region 단위로 탐색해 Region 단위로 GC가 발생한다.
  • 현재 GC 중에서 Stop The World 가 가장 짧다.
  • JDK 11 에서 G1 GC 를 default로 채택했다.

출처 : https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

Share