자바 모니터링에서 주목해야 할 지표는 Heap 메모리 지표와 GC 지표입니다. Heap 메모리에서 튜닝과 성능 관리는 매우 중요하며, 튜닝과 정책 설정에 있어 뛰어난데요.
Heap에 메모리 부족 시, 성능에 문제를 일으키기도 합니다. 실제로, Full GC 실행에 오랜 시간이 지연되면 연계된 부분에 있어 타임아웃이 일어날 수 있습니다.
이번 WhaTip에서는 JVM Heap 메모리 영역에 대해 소개해 드리겠습니다. 😊
[JAVA Full GC 모니터링, 어떻게 하면 잘할 수 있을까?]JVM이 관리하는 영역은 크게 3가지로 나눠지는데 스택(Stack), 힙(Heap), 스태틱(Static Area) 영역으로 분류됩니다.
그중, Heap 영역에 대해 소개해 드리려 합니다. Heap은 아래와 같이 크게 Young Generation과 Old Generation으로 구분이 됩니다.
Young 영역에는 새로운 객체가 Eden 영역에 할당이 됩니다. Eden 영역이 꽉 차게 되면 Minor GC가 발생하게 되고, Mark & Sweep 알고리즘을 수행합니다. 새로운 객체가 Eden 영역에 할당이 되면 Reachable한 객체와 Unreachable한 객체를 탐색하는데요. 여기서 살아남은 객체들은 또다시 Survivor 영역 중 한 곳으로 이동합니다.
(Survivor 영역 중, 한 공간은 반드시 비워둬야 합니다. 만약, Survivor 0으로 배정됬다면, 반대편인 Survivor 1은 비워있어야 합니다.)
Sweep 과정을 통해 Unreachable한 객체는 삭제되며 살아남은 객체들의 age 값이 증가하게 됩니다.
객체의 age 값이 특정 임계치에 도달하게 되면 Old Generation으로 이동합니다.
age 값이 높은 객체들로 Old Generation 영역이 가득 차게 되면, Major GC가 발생합니다. Young 영역에서는 객체의 수가 작고 수명이 짧은 반면, Old 영역에는 많은 객체들이 존재합니다. 실제, Young Generation 비율이 Old Generation 의 비율보다 훨씬 적습니다.
Minor GC가 발생하면 꽤 많은 객체들이 수거되는데 이는 빈번하게 일어나는 메모리 낭비를 막을 수 있습니다. 반면, Major GC가 발생하면 애플리케이션에서 아무런 동작을 하지 않기에 일어나는 횟수를 최소화해야 합니다.
GC는 자바 애플리케이션에서 사용하지 않는 객체를 메모리에서 삭제하는 기능을 의미합니다.
메모리 안에서 참조되고 있는 객체와 참조되지 않은 객체를 구분한 후, 참조되지 않은 모든 객체를 전부 수거하여 메모리 누수를 방지합니다.
Heap은 튜닝과 정책 설정에 있어 매우 뛰어나지만, 성능에 있어 문제를 일으키는 건 메모리 부족 현상입니다. 그때 직접적인 영향을 받는 건 Full GC가 발생했을 때입니다.
Full GC (혹은 Major GC)가 발생하면 자바 애플리케이션이 중단됩니다. Full GC가 발생하는 정도와 시간에 따라 애플리케이션의 성능과 안정성에 큰 영향을 미치기에 발생 시간과 빈도를 줄이기 위한 노력이 필요합니다.
이를 카운팅하고 툴을 써서 현황을 확인할 수 있지만, Full GC를 별도로 로깅하고 싶다면, 추가적인 프레임워크에서 Full GC가 발생한 것을 알림 시스템을 통해 수신 받을 수 있습니다.
이번 콘텐츠에서는 Garbage Collection의 개념 및 동작 원리에 대해 소개했습니다. 다음 콘텐츠에서는 예시 코드로 GC 모니터링 실습해 보겠습니다.