Java는 Young 영역
과 Old 영역
으로 메모리를 분할하는데, 신규로 생성되는 객체는 Young 영역
에 보관, 오래 살아있는 객체는 Old 영역
에 보관한다.
Young 영역
은 Eden
, S0
, S1 영역
으로 구분되는데, 신규 생성 객체는 Eden 영역
에 보관되고 Eden 영역
이 100% 차게 되면 사용하지 않는 객체는 제거, 사용되는 객체는 S0 영역
으로 이동한다. 이를 마이너 GC라고 칭함.
다시 Eden 영역
이 100%가 되면 Eden 영역
과 S0 영역
에서 사용하지 않는 객체는 제거, 남은 객체를 S1 영역
으로 이동시킨다. (마이너 GC)
S1 영역
에서도 살아남는다면 Old 영역
으로 이동한다.
Old 영역
이 100%가 되면 메이저 GC (Full GC) 가 발생한다. 이 때, JVM의 동작을 멈추고 Old 영역
의 메모리를 정리하게 된다.
메이저 GC가 발생하면 프로그램의 동작이 멈추기 때문에 큰 이슈가 발생할 수 있다.
OOM, Out Of Memory 에러는 JAVA GC 가비지 컬렉터가 정상적으로 작동하지 않아 발생하는 에러로 Heap 힙 메모리가 가득 찼을 때, 발생하여 서버에 부하를 주게 된다.
위와 같은 상황 발생 시, GC 모니터링을 수행해야 한다.
$ jstat [유틸옵션] [PID] [반복 출력 시간]
# PID 129의 정보를 1초(1000)마다 반복 출력
$ jstat -gcutil 129 1000