JAVA

Java Garbage Collector 의 종류

소농배 2020. 5. 6. 22:08

Serial GC ( -XX:+UseSerialGC )

 Serial Collector 는 Java SE 5 와 6 의 기본 Garbage Collector 였다. Serial Collector 는 하나의 가상 CPU 를 사용하여 Minor GC 와 Major GC 가 순차적으로 끝난다. 그리고 mark 하고 압축(mark-compact)하는 수집 함수를 사용한다. 이 함수는 오래된 메모리들을 Heap 영역의 시작점으로 이동시켜서 새로운 메모리 할당은 힙 영역 끝에서 단일된 연속의 덩어리로 만들어지도록 한다. 이 메모리 압축은 새로운 덩어리의 매모리를 Heap 에 할당할때 더 빠르게 만든다.

 

Parallel GC ( -XX:+UseParallelGC )

 Parallel Collector 는 Young Generation 을 GC 하기 위해 여러개의 쓰레드를 사용한다. 디폴트로 호스트가 N 개의 CPU 를 사용한다면 N 개의 쓰레드를 GC 에 사용한다. 

-XX:+UseParallelGC 옵션을 사용하면 Young Generation 의 GC 에는 여러개의 쓰레드가 사용되지만 Old Generation 의 GC 에는 하나의 쓰레드만 사용된다. -XX:+UseParallelOldGC 를 사용하면 Young 과 Old Generation 를 GC 할때 여러개의 쓰레드를 사용한다. 힙 영역 압축은 Old Generation 만 된다. Young Genration 은 Copy Collector 로 간주된다. 때문에 압축이 필요없다.

 압축은 GC 에 의해서 힙 영역에 빈 구멍이 없도록 하는 것이다. GC 이후에 살아있는 객체들 사이에는 빈 구멍이 존재할 것이다. Paralle Collector 와 Parallel Compaction Collector 의 차이는 GC 이후에 공간을 압축하느냐 안하느냐의 차이다.

 

CMS GC ( -XX:+UseConcMarkSweepGC )

 CMS Collector 는 짧은 "pause time" 이 요구되고 응용프로그램과 GC 가 자원을 공유할 수 있을때 사용된다. CMS Collector 는 응용프로그램의 쓰레드와 함께 GC 작업을 동시에 진행하여 "pause time" 을 최소화 하려고 시도한다. 일반적으로 Concurrent Low Pause Collector 는 살아있는 객체를 복사하거나 압축하지 않는다. GC 는 살아있는 객체를 이동하지 않고 끝난다. 만약 살아있는 객체 파편들이 문제가 된다면 더 큰 힙을 할당한다. CMS Collector 는 Young Generation 에 한하여 Parallel GC 와 동일한 알고리즘을 사용한다.

 - CMS Collector GC

 

CMS Collector ( Concurrent Mark Sweep Collector ) GC 과정

 

woooongs.tistory.com

G1GC ( -XX:+UseG1GC )

 Garbage first Collector 는 CMS Collector 를 대체하기 위해서 오래전부터 고안되었고 java7 부터 사용 가능하다. 다른 Collector 과는 다른 레이아웃을 사용하기 때문에 다음 장에서 설명한다.

 - G1 Collector GC

 

G1GC ( Garbage First ) GC 과정

 

woooongs.tistory.com

 

출처 : https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html