Computer Science/JAVA

JVM, GC 알아보자 3

suleesulee 2021. 9. 14. 23:59

JAVA에서 GC 도입이 가능했던이유

Weak generational hypothesis 가설

- 대부분의 객체는 금방 접근 불가능 상태가 된다.

- 오래된 객체에서 최신의 객체로의 참조는 아주 적게 존재한다.

 

GC의 종류

JVM 버전이 올라가며 다양한 GC 방식이 도입되었다.

Serial GC

Mark-Sweep-Compaction 알고리즘을 생각하면된다.

순차적으로 사용되지 않는 객체를 식별하여 지우고 압축 과정을 거친다.

디스크 조각모음처럼 동작한다고 생각하면된다.

싱글 스레드만 사용하는 GC

Parallel GC

Serial GC의 멀티 쓰레드 방식으로 멀티쓰레드를 사용함으로 성능이 향상되어

STW(Stop-the-world)가 줄어든다.

Parallel Old GC

Parallel GC를 업그레이드한 버전

Mark-Summary-Compation 알고리즘을 사용한다.

Summary작업을 통해 GC를 수행한 영역에 대해서 살아있는 객체를 식별한다.

 

Concurrent Mark & Sweep GC(CMS GC)

STW 시간을 최소화 하는데 초점을 둔 GC로 GC대상을 파악하는데 초점을 두기에 CPU 사용량이 높다.

또한, Compation이 기본적으로 존재하지 않는다.

Intial Mark -> Concurrent Mark -> Remark -> Concurrent Sweep 과정을 거친다.

첫단계에는 클래스 로더에 가까운 객체 중 살아있는 객체만 찾는다.

두번째 단계에서는 첫단계에서 살아있다고 마킹한 객체가 참조하는 객체를 확인한다.

세번째 단계에서는 두번째 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다.

마지막 단계에서 Garbage를 정리한다. 

기본적으로 첫번째 단계에서 짧은 STW가 있고 나머지 단계는 다른 스레드들이 실행될때 같이 실행된다.

해당 GC 사용시 Compaction 작업을 해야하는데 이것이 STW를 늘릴 수 있기에 Compaction 작업의 빈도와 시간을 확인해야한다. 

 

G1(Garbage First) GC

앞에서 나열한 모든 GC보다 가장 빠른 방법이며 JDK7 버전부터 정식적으로 포함해서 제공되었으며 JDK11부터는 Default GC로 적용되었다. 

대용량 메모리에 적합한 솔루션이며 해당 GC는 기존의 Young, Old 영역의 개념을 잊어야한다.

Eden, Survivor, Old 영역은 존재하지만, 전체 Heap을 Region이라는 크기로 나누며

Region의 상태에 따라 Region의 역할이 동적으로 변한다.

>추후 동작 방식을 추가하자

ZGC

차세대 GC로 낮은 지연율을 가진 GC이다. (궁극적으로 STW를 10ms 이하로 지원)

ZGC는 메모리를 Z Pages로 영역을 나눈다. Z pages는 동적 크기로 2MB의 배수가 동적으로 생성 및 삭제 가능하다.

64비트 운영체제에서만 사용가능하다.

 

 

 

* STW는 Minor, Full GC 모두 발생한다. 하지만 멈추는 시간의 차이가 크기 때문에

GC로 인해 갑자기 멈췄다 다시 수행이 시작될때 이벤트가 몰려들어 큐가 꽉차게 되는 현상이 발생해

장애로 이어질수있기에 GC튜닝을 한다.

 

 

참조:

https://sarc.io/index.php/java/2098-zgc-z-garbage-collectors 

https://d2.naver.com/helloworld/1329

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

https://huisam.tistory.com/entry/jvmgc