Iyoungman Back-end Developer

Minor GC 와 Major GC

2020-06-02
 

Summary

  • JVM Heap의 Young, Old 영역에 대해 알아본다.
  • Minor GC와 Major GC에 대해 알아본다.
  • GC 방식에 대해 알아본다.


Heap의 Young, Old 영역

  • 가비지 콜렉터는 Heap 영역에서 사용하지 않는 객체를 메모리에서 제거한다.
  • Heap에는 크게 2개의 물리적 공간으로 나뉜다.

Young Generation 영역(이하 Young 영역)

Old Generation 영역(이하 Old 영역)


image


Young 영역

  • 새롭게 생성한 객체가 위치하는 영역이다.
  • 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 말한다.
  • Young 영역은 3개의 영역으로 나뉜다.

Eden 영역

Survivor 영역(2개)


Old 영역

  • Young 영역에서 살아남은 객체가 복사되는 영역이다.
  • 대부분 Young 영역보다 크게 할당하기 때문에 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
  • 이 영역에서 객체가 사라질 때 Major GC가 발생한다고 말한다.


Minor GC 과정

  • 아래 예제를 통해 Minor GC 과정에 대해 알아본다.
  • Minor GC는 Copy And Scavenger 과정을 거친다.


1) Eden 에서 Survivor 영역 이동

새로 생성한 대부분의 객체는 Eden 영역에 위치한다.

여러 객체를 생성했다고 하자.

A, B, C, D, E, F 라고 부르겠다.

image



Eden 영역이 꽉 찼으므로 Minor GC가 발생한다.

Minor GC가 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동한다.

A, B, C가 살아남았다고 가정한다.

image



Eden 영역에 새로운 객체 H, I, J가 생성되었다.

image



Eden영역이 꽉 차거나, Survivor영역이 꽉 차면 Minor GC가 발생한다.

Minor GC가 발생하면 Eden과 S0에 Alive된 객체를 S1에 복사한다.

Eden에서는 I 가 Alive, S0에서는 A,B가 Alive라고 가정한다.

image



Minor GC후에 Eden과 S0에 남은 객체는 죽은 것이므로 Clear한다.

즉, 더이상 참조되지 않는 객체라는 의미이다.

image



다음번 Minor GC가 발생하면 같은 원리로 Eden과 S1 영역에 Alive된 객체를 S0에 복사한다.

이러한 과정을 반복한다.

따라서, Survivor 영역 중 하나는 반드시 비어있는 상태여야한다.



3) Survivor 에서 Old 영역으로 이동

  • Minor GC에서 살아남아 Survivor로 이동할때마다 객체의 Age가 증가한다.
  • Age가 일정 이상이 되면 Old 영역으로 이동한다.
  • Age는 -XX:MaxTenuringThreshold 옵션으로 설정할 수 있다고 한다.

아래 그림에서 A,B가 Alive 되어있고 Age가 일정 이상 되었다고 하자.

Minor GC가 발생하면 A,B는 Old 영역으로 이동한다.

I는 Alive 지만 Age가 일정 이상 되지 않아 S0으로 이동한다.

image



4) Old 영역

Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행한다.

Full GC, Major GC가 발생하면 GC를 한다.


GC의 방식

1. Serial GC

  • Young 영역에서는 위의 GC 과정에서 설펴본 방식을 사용한다.
  • Old 영역의 GC는 Mark-Sweep-Compaction 알고리즘을 사용한다.

Mark : Old 영역에 살아 있는 객체를 표시한다.(Mark)

Sweep : Old 영역의 Mark된 객체를 제외하고 제거한다.(Sweep)

Compaction : 살아있는 객체를 모은다.(Compaction)


Compaction을 하는 이유는?

  • 메모리 단편화 제거


2. Parallel GC

  • Serial GC와 기본적인 알고리즘은 같다.


차이점은?

  • Serial GC는 Minor GC에서 처리하는 스레드가 하나인 것에 비해
    Parallel GC는 Minor GC를 처리하는 스레드가 여러개이다.

  • 따라서 Serial GC보다 빠르게 객체를 처리한다.


3. Parallel Old GC

  • Parallel GC와 비교해 Old 영역의 GC 알고리즘만 다르다.
  • Old 영역에서 Mark-Summary-Compaction 알고리즘을 사용한다.

Mark-Sweep-Compaction 연산과는 Sweep과 Summary의 차이다.

Sweep은 단일 스레드가 Old 영역을 훑어 객체만 찾아내는 방식이지만

Summary는 여러 스레드가 Old 영역을 분리하여 훑는다.



4. CMS(Concurrent-Mark-Sweep) GC

  • Stop-The-World 시간을 최소화하기 위한 방식이다.

image


  • Old영역은 GC는 다음 흐름과 같다.

Initial Mark -> Concurrent Mark -> Remark -> Concurrent Sweep

Initial Mark : GC Root에서 참조 Tree상 가장 가까운 객체만 1차적으로 GC 대상인지 판단한다. Stop-The-World 가 발생하지만 탐색 깊이가 얕기 때문에 시간이 짧다.

Concurrent Mark : Initial Mark 단계에서 살아있다고 확인된 객체에서 참조하고 있는 객체들을 따라가며 확인한다. Stop-The-World가 발생하지 않는다.

Remark : Concurrent Mark 단계에서 새로 추가되거나 끊긴 객체를 확인한다. Stop-The-World가 발생하며 이 시간을 줄이기 위해 멀티 스레드를 이용한다.

Concurrent Sweep : Mark된 쓰레기 객체를 정리한다. Stop-The-World가 발생하지 않는다.


  • 장점은 Stop-The-World 시간이 짧다.

  • 단점은 다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다.
  • 또한, Compaction 단계가 기본적으로 제공되지 않는다.
    필요하면 별도의 설정이 필요.


5. G1 GC

  • Young 영역과 Old 영역을 나누지 않고
  • 바둑판 모양 각 영역에 객체를 할당한다.
  • 모든 GC 방식중에 가장 빠르다.



Next

  • Young과 Old 영역, GC 방식에 대해 간단하게 알아봤다.
  • 추후에 실제로 사용할 일이 생긴다면 각 GC 방식에 대해 더 자세히 알아봐야겠다.


Reference


Comments

Content