요번 포스팅에는 저번 포스팅에 이어 HotspotJVM의 Garbage Collector에 대해 알아보도록 하겠다. 


HotspotJVM의 Garbage Collector에는 5가지 종류의 Collector들이 존재한다. 


1.Serial Collector 

2.Parallel Collector

3.Parallel Compaction Collector 

4. CMS Collector 

5. Garbage First Collector 


제일 먼저 Serial Collector에 대해 알아보자. 


1.Serial Collector 


Young Generation과 Old Generation의 Garbage Collection  모두를  Serial로 처리하는 방식이다. 

1개의 Thread를 가지고 GC수행하고, Hotspot JVM의 가장 기본적인 collector이다. 


Young Generation – Generational Algorithm의 동작원리를 살펴볼까?


Minor GC가  발생 하면  


Minor GC가  발생결과 


old Generation – Mark and Compacting 알고리즘의 동작원리를 살펴볼까?


Serial Collector가 나온 이후 IT환경이 급변하여, heap의 크기를 점점 크게 설정해야 하는 상황이 도래함에 따라 Serial Collector의 한계가 드러나기 시작하였다.가장 큰 문제는 GC를 수행 하는 중에 나타나는 suspend현상인데 

heap이 커짐에 따라 suspend현상은 두드러졌고 application은 점점 실시간에 가까운 성능을 요구하고 있었다. 


그래서 두가지 전략으로 분화 되었다.


*Throughput Collector

모든 리소스를 투입하여 garbage collector를 빨리 끝내자는 전략.

이는 대용량의 heap에 적합하며,

이 전략을 채택한 garbage collector는 병렬 처리를 수행하는 방법으로 채택. 


*Low Pause Collector 

Suspend를 분산시켜 체감 pause time을 줄이자는 전략. 

실시간을 요구하는 application에 적합. 이 전략을 채택한 Garbage Collector는 GC를 수행하는

동시에 application의 작업도 수행(concurrent)하는 방식을 사용하고 있음.


2.Parallel Collector 


Throughput Collector중 하나이다.
많은 CPU를 동원하여 Garbage Collection시간을 단축 시키자는 아이디어가 parallel collector로 구체화 되었고.
Multi-Thread가 동시에 Garbage Collection을 수행한다. 단 young generation에만 국한된다.

Young Generation은 Parallel Copy Algorithm을 사용한다.


*여기서 잠깐 


메모리의 특성상 같은 메모리 공간을 두 Thread혹은 Process가 접근하게 되면 Corruption이 발생!

이러한 Corruption을 회피하기 위해 동기화 작업이 수반되어야 하는데 이 경우 promotion의 성능이 떨어진다. 


Hotspot은 이를 위해 PLAB(Parallel Local Allocation Buffer)이라는 Promotion Buffer를 마련하였다.

Promotion Buffer란 Garbage Collection Thread가 Promotion시 배타적으로 사용하기 위해 Thread마다 

Old Generation의 일정 부분을 할당해 놓는 것을 말한다.



하지만 많은 수의 Thread가 자신의 buffer를 할당 받은 채 사용되지 않거나 

어쩔 수 없이 발생하는 buffer내의 자투리 공간이 heap단편화의 원인이 될 수도 있다.

이 문제가 발생할 경우 GC Thread를 감소 시키거나 Old Generation의 size를 늘이는 방범으로 문제를 회피할 수 있다.


Old Generation은 Mark-and-Compating 알고리즘을 사용한다.


3.Parallel Compaction Collector


Parallel Collector에서 Old Generation에 새로운 algorithm을 추가한 업그레이드 개념이다.

Oracle에서도 향후 Parallel Collector를 대체 할 수 있다는 전망을 내놓고 있다.

Multi CPU에 유리하고 Old Generation의 Collection시간을 감소시켜 전체적인 효율을 증가시킨다. 


Young Generation은 Parallel Copy Algorithm을 사용한다.

Old Generation은 Parallel Compaction Algorithm을 사용한다. 









4. CMS Collector


Pause Time Goal에 맞는 collector이다.

CMS Collector는 Garbage Collection시 수반되는 suspend time을 적절하게 분산하여 응답시간을 개선하는 방식을 사용한다.

Young Generation에서는 Parallel Collector와 동일한 Parallel Copy Algorithm

Old Generation에서는 Concurrent Mark-Sweep Algorithm을 사용한다. 





하지만 단편화 문제 발생, 이를 해결하기 위해 freelist를 사용하여 young generation에서 promotion된 

object와 크기가 비슷한 free space를 탐색하는 방법 고안하였다.

그러나 Young Generation의 부담만 가중되었다.





5. Garbage First Collector 


CMS GC를 대체하기 위해서 만들어 졌다. 

물리적인 Generation의 구분을 없애고 전체 Heap을   1Mb~32Mb단위의 Region으로 재편하였다.

Garbage First라는 말대로 Garbage로만 꽉 차있는 Region부터 GC를 시작한다.

Concurrent + Parallel + Compacting의 조합이다.



이렇게 Hotspot JVM의 Garbage Collector의 종류의 대해 알아보았다. 

끝!




참조문헌 

http://blog.takipi.com/garbage-collectors-serial-vs-parallel-vs-cms-vs-the-g1-and-whats-new-in-java-8/

http://www.omsn.de/blog/brief-comparison-of-java-7-hotspot-garbage-collectors

Java Performance Fundamental 김한도 지음 ㈜엑셈 

http://helloworld.naver.com/helloworld/textyle/1329

http://blog.jelastic.com/2013/01/24/the-truth-about-paas-vertical-scaling-and-why-you-are-being-oversold/

https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&sqi=2&ved=0CCUQFjAA&url=http%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavase%2Ftech%2Findex-jsp-140228.html&ei=MMXaVL2TJOe5mwWZnoCADw&usg=AFQjCNHhFj3D5-BfVBPuZ6JL7JF7PCX-UA&sig2=z4gqAR4bu7LA-7IN2lLwbg&bvm=bv.85761416,d.dGc&cad=rja

http://www.infoq.com/articles/Java_Garbage_Collection_Distilled

http://blog.novatec-gmbh.de/g1-action-better-cms/


 




Posted by 비회원