[JVM] G1 Collector - Full GC 발생하는 상황

2021. 12. 16. 15:13 JAVA/JVM

CMS와 마찬가지로 G1의 목표는 Full GC가 발생하지 않는 것
Full GC 가 발생하는 네 가지 경우는 다음과 같다

1) Concurrent GC Fail , 동시 병렬모드 실패
- Concurrent GC는 표시 단계를 거쳐서 혼합 컬렉션때 가비지가 소거된다.
그런데 혼합 컬렉션이 진행되기 전, 표시 단계에서 올드 제너레이션이 가득찰 경우 G1은 표시 단계를 중단한다.

- 이 때, 힙 크기를 늘리거나, 표시 단계를 빨리 시작하거나, 표시 단계의 스레드 수를 늘려서 표시 단계가 더 빨리 수행되도록 튜닝해야 한다. 

2) 승격 실패 ( 영 -> 올드 )
- 혼합 컬렉션이 시작되었지만, 혼합컬렉션에 의해 소거되는 올드 제너레이션의 영역보다, Minor GC로 승격되어서 올드 제너레이션 영역으로 이동하는 객체들이 더 많을 때 혼합 GC에 이어 바로 Full GC가 발생한다. 

3) 비우기 실패
- Minor GC 가 발생했는데, 살아남은 객체를 저장할 공간이 부족할 경우
- 힙이 가득 찼거나, 힙이 단편화되었을 경우 나타난다.
- 가장 쉬운 해결 방법은 힙 크기를 늘리는 것.
- 주의! 로그에서는 Minor GC처럼 보인다. 

4) 대규모 할당 실패
- 매우 큰 객체를 힙에 할당해야 하는 경우
- Full GC가 명백한 이유 없이 발생한 경우 의심해봐야 한다.
- 실제로, 엑셀 업로드와 같이 큰 규모의 객체할당이 필요한 경우 나타날 수 있다. 이 때 업로드의 크기를 제한하여 올리는 방식으로 문제를 해결하였다.