JAVA
가비지 콜렉터의 종류
whyWhale
2021. 5. 3. 14:08
※ GC 간단 정리
- 처음 생성된 객체는 Eden 영역에 할당.
- Eden 영역이 꽉차면 Survivor 0,1 둘 중에 빈 공간이 아닌 곳으로 이동한다.
- Survivor 영엑에 있는 객체가 꽉 찰 때 다시 GC의 객체가 사용중인지 아닌지 심사받고 다른 Survivor 영역으로 이동한다. 그리고 aging을 한다.
- old 영역으로 이동한다.
- Survivor 영역의 크기보다 큰 경우.
- aging이 어느정도 되는 경우.
GC의 종류
Major GC | Old,Perm 영역에서 발생하는 GC |
Minor GC | Young 영역에서 발생하는 GC |
Pull Gc | 메모리 전체를 대상하는 GC |
각 GC의 종류에 따라 성능에 크게 영향을 줍니다.
GC를 진행하는 방법은 총 5가지가 있다.
GC 방식
1. Serial Collector
- 하나의 CPU로 Young영역과 Old 영역을 연속적으로 처리한다.
- 메모리가 적고 CPU 코어 개수가 적을 때 적합한 GC방식이다.
- 컬렉션이 수행될 때 애플리케이션이 정지
- Old 영역에서 쓰지 않는 객체를 표시해서 한곳으로 모으고 삭제하는 Mark & Sweep Compact알고리즘 사용
- Mark : 살아있는 객체들을 찾아 표시.
- Sweep : Heap의 앞부분터 확인하면서 살아있는 객체만 남긴다.
- Compact : 쓰레기 객체를 지우고 살아있는 객체를 모은다.
2. Parallel Collector
- 메모리가 충분하고 코어의 개수가 많을 떄 적합한 GC방식
- CPU가 GC의 진행시간 동안 대기 상태로 남아 있는 것을 최소화 하는 것.
- Old 영역의 GC는 Mark&sweep Compact알고리즘을 사용한다.
- Serial Collector의 Young 영역에서 진행하는 컬렉션을 병렬 방식으로 처리하여 GC의 부하를 줄이고 성능을 향상 시킬 수 있다.
3. Concurrent Mark Sweep(CMS)
- 2개 이상의 CPU를 사용하는 서버에 적합한 GC방식.
- 힙 메모리의 크기가 클 때 적합.
- Young영엑에 처리 방법은 Parallel Collector 의 Young영역의 GC알고리즘과 같다.
- Stop the world 가 짧다.
- 하지만 다른 GC 보다 CPU 자원을 많이 소모한다.
- Compaction 을 제공하지 않는다.
- 메모리 파편화로 Compact수행시 다른 GC보다 stop the world가 길어진다.
- 흐름
- Initial Mark : class Loader 에서 가장 가까운 객체 중 살아 있는 객체만 찾는다.
- Concurrent Mark : 올스탑 없이 살아 있다고 확인한 객체에서 참조하고 있는 객체를 확인한다.
- Remark : Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인.
- Concurrent Sweep : 올스탑 없이 참조 되지 않는 객체를 정리.
CMS 방식에서는 컴팩션을 지원하지 않는다. 그러므로 다른 옵션을 사용하여 메모리를 모아주는 작업이 필요.
4. G1 ( Garbage First Collector)
- G1 콜렉터는 Young 영역과 Old 영역으로 나누는 방식을 사용하지 않는 특이한 컬렉터이다.
- 바둑판 모양으로 구성되어 있으며 약 2000개의 구역을 사용.
- 바둑판 모양의 구역에서 일부를 선정하여 Young 영역으로 지정한 후 해당 구역에 데이터가 꽉차면 GC를 진행.
- GC 후 살아있는 객체만 Survivor영역으로 이동.
- CMS Collector 의 CPU 자원 파편화의 단점을 해결하기 위해 만들어진 방식.
- 가장 많은 공간이 있는 곳 부터 회수 하여 진행하므로 Garbage First라는 이름이 붙였다.
- 가장 큰 장점은 어떤 GC보다 빠르다.
- JDK 7에서 정식으로 사용가능한 방식.
5. Z Garbage Collector
- 64bit 플랫폼에서만 동작한다.
- Color Point 방식으로 Heap 영역에 있는 객체들을 관리하기 떄문이다.
- ZGC의 설계 목표
- stop the world 로 인한 지연시간이 10ms 초과하지 않는다.
- Heap 사이즈가 커져도 stop the world 시간이 증가하지 않는다.
- 8MB ~ 16TB이르는 다양한 Heap 사이즈를 처리할 수 있다.
- 영역과 비슷한 개념인 Zpage를 사용한다.
- Zpage는 2MB의 배수로 동적으로 생성,삭제가 가능하다.