Spring Boot로 배포중인 웹 애플리케이션에 대한 모니터링을 위해 Prometheus 의존성을 추가하고 Grafana와의 연동에 성공했다.

 

그리고 wrk 를 사용해 스트레스 테스트를 시작했다.

 

가장 먼저 눈에 띈것은 'JVM Statistics - Memory' 영역에 위치한 그래프들이었다.

 

이것들을 이해하기에 앞서 먼저 'G1 GC'에 대해 알아보자.

 

"Garbage-First Garbage Collector - 쓰레기가 가장 많이 들어 있는 조각 부터 우선 청소한다."

 

여기서 말하는 '쓰레기'란, 프로그램 실행 도중에 더 이상 참조되지 않아 필요가 없어진 객체(데이터 조각)을 의미한다.

 

쓰레기를 청소해줘야하는 가장 큰 이유는 '메모리 회수'이다. 참조가 끊긴 객체를 그대로 두면 힙(heap)이 끝없이 불어나 OOM Error(메모리 부족)으로 애플리케이션이 중단될 수 있다.

 

Spring Boot 로 개발한 웹 애플리케이션이 구동되는 'JVM'은 크게 'G1 Eden Space, G1 Old Gen, G1 Survivor Space' 세가지 영역으로 분리하여 '쓰레기(Garbage)'를 관리한다.

정확히는 고정된 '공간(Space)' 개념은 아니고, 힙 전체를 균일한 크기(Region)로 잘라 필요에 따라 Eden·Survivor·Old 등의 역할을 동적으로 지정한다. 영역 수 자체가 셋으로 정해져 있는것은 아니며, 모니터링 도구(Prometheus/Grafana)에서 편의상 세개의 영역으로 묶어 보여준다.

 

G1 Eden Space: 새로 생긴 객체가 처음 들어오는 곳, 가득차면 Minor GC가 트리거되어 쓰레기는 청소가 되고 살아 남은 객체는 Survivor으로 복사된다.

G1 Survivor Space: Eden Space에서 살아 남은 객체들이 잠시 머무는 곳, 특정 객체가 이 곳에서 이루어지는 Minor GC에서 또 살아남는다면 age값이 누적된다. age값이 임계치에 도달하면 Old Gen으로 승격된다.

보통 Survivor Space는 두 개(S0, S1)로 이루어져 있으며, 번갈아 가면서 사용된다. Minor GC가 트리거 되면 한 번은 S0에서 S1로 객체를 옮기고, 다음 번엔 다시 S1에서 S0으로 객체를 옮기는 식으로 반복된다. 이 방식을 "from/to 버퍼" 방식이라고 부른다.

 

위 두 영역을 뭉뚱그려 'Young Generation' 이라고 표현한다.

Minor GC: JVM의 Young Generation(Eden + Survivor)을 비우는 짧은 정지 기반 GC이다. Eden이 꽉 차면 애플리케이션 스레드를 잠깐(STW, Stop the world) 멈추고, 살아 있는 객체만 Survivor로 복사한 뒤 Eden 전체를 즉시 재사용한다. 대상 영역이 작아 보통 수~수십 ms 내에 끝나며, Heap 전체를 청소하는 Full GC보다 멈춤과 부담이 훨씬 작다.

 

G1 Old Gen: 여러 번 살아남아 장기 거주가 확정된 객체를 Eden에서 바로 승격시켜 보관하는 곳, 또는 크기가 큰 객체(Humongous)를 직접 배치하는 곳.

Young GC(=Minor GC)가 이루어지는 시점에 Old Gen영역에 있는 조각들 중 쓰레기가 특히 많은 조각을 덤으로 같이 비우는 Mixed GC가 이루어진다 (단, Old Gen 영역의 사용률이 지정 임계치를 넘었을 경우) . 이로써 Full GC가 트리거 되는 것을 최대한 늦출 수 있게 된다.

Old Gen이 꽉 차거나 단편화가 심할 때 최후의 수단으로 Full GC가 트리거된다.

 

Full GC: JVM이 힙 전체(Young + Old + 메타 영역)를 한꺼번에 정리하는 '최후의 대청소'이다. Old Gen이 거의 가득 차거나 단편화가 심해 Mixed GC만으로 공간을 못 비울 때, 또는 대형(Humongous) 객체·메타영역 부족 등이 발생할 때 트리거된다. 실행 시 모든 애플리케이션 스레드를 STW(Stop the world)로 잠시 멈춘 뒤, 불필요 메모리를 회수한다. 보통 수백ms~수 초까지 멈춤이 길어 응답 지연 또는 503/504오류의 원인이 된다.