GC란?

Garbage Collection는 JVM의 Heap영역에서 사용하지 않는 객체들을 제거하는 프로세스를 지칭한다.

 

어떤 알고리즘으로 작동하는가?

GC는 Mark & Sweep (+Compact) 알고리즘으로 작동한다. 사용하지 않는 객체를 Marking하고, 추후에 이를 Sweeping(쓸어버림)한다. 그럼 중간 중간 빈 공간이 생기는데 몇몇 GC들은 메모리 단편화를 막기위해 이를 Compact해주기도 한다.

 

Unreachable, Reachable?

Mark할 객체의 기준을 어떻게 정하는가? 사용하지 않는 객체들을 Unreachable하다고 얘기하는데, 해당 객체를 정하는 기준은 GC Root로 부터 해당 객체를 참조하고 있는지 확인한다. GC Root는 Stack, Method Area에 있는 지역변수값등을 얘기하고, Heap의 또다른 객체로 부터 이를 참조하는지도 확인한다.

 

상세 알고리즘 동작 방식은? *(Major GC, Minor GC, Young Generation, Old Generation)

java에서는 갓 생성된 객체를 Eden이라는 메모리 영역에 올리는데 해당 영역이 꽉차면 minor GC가 실행되면서 사용하지 않는 객체(unreachable한 객체)를 제거하고, 살아남은 객체들을 Survivor영역에 올린다. Survivor 영역은 0, 1로 나뉘고 한 phase당 하나만 사용된다. Minor GC는 Eden + Survivor(0 or 1)을 살피며 살아남은 객체를 현재 사용되지 않는 Survivor영역으로 옮긴다. 이렇게 옮기면서 각 객체들의 age를 올려준다.

특정 age 임계점이 되면 이를 Old generation 영역으로 옮긴다. Old generation영역도 꽉차면 Major GC가 실행되면서 사용하지 않는 객체들을 제거한다.

 

위와 같은 알고리즘(Young/Old 분리) 동작 방식을 취하게 된 계기는? (GC 설계의 두가지 전제)

1. 새롭게 생성된 객체들의 대부분은 금방 사용하지 않게 된다. (=> Young Generation에 한해서 Minor GC를 설계하게 된 계기)

2. 오래된 객체가 새로운 객체를 참조하는 일은 드물게 일어난다.

 

Stop- The - World

GC가 실행되는 동안 다른 스레드가 모두 멈추는데, 이를 Stop-The-World라고 한다.

 

GC의 종류는?

Serial GC - 싱글 스레드로 GC를 진행한다. 그만큼 Stop-The-World시간이 길다.

Parallel GC - Young Generation 처리를 병렬로 처리한다.

Parallel Old GC - Old Generation'도' 병렬로 처리한다.

CMS GC - GC를 처리하는 스레드는 하나, 하지만 다른 스레드는 멈추지 않고 프로그램을 진행한다. Compact과정이 없다.

G1 GC - CMS를 발전시킴. Heap 영역을 Region영역으로 나누어 Garbage만 있는 Region을 우선적으로 탐색하여 수거한다. Java9의 default GC.

+ Recent posts