Community

☕️ ZGC 의 기본 개념 이해하기

Naver 기술 블로그인 D2 에서 Java 의 새로운 garbage collector 인 ZGC 의 메모리 구조와 처리 흐름을 자세히 정리한 글이 있어 공유드립니다. ZGC(Z Garbage Collector)는 Serial GC 와 Parallel Old GC, Parallel GC, CMS GC, G1 GC 를 지나 새로운 세대로 등장한 Java 의 garbage collector 입니다. JDK 11 에 실험적 기능으로 추가되었고, JDK 15 에서 정식 garbage collector 로 인정된 다음 LTS(long term support) 버전인 JDK 17 에도 반영되었습니다. ZGC 의 주요 목표는 큰 힙 크기와 많은 객체 할당을 요구하는 애플리케이션에 대해 낮은 지연 시간과 높은 처리량을 제공하는 것입니다. 이를 위한 핵심 기능 중 하나로 실행 중인 프로그램의 중단(Stop The World)을 최소화하면서 응용 프로그램 쓰레드와 동시에 대부분의 GC 작업을 수행할 수 있다는 것입니다. ZGC 는 GC pause 시간을 최소화하고 큰 힙 크기를 지원한다는 점에서 G1 GC 와 유사해보이지만, 한층 개선된 동시 및 병렬 설계를 통해 더 낮은 pause 시간과 높은 처리량을 달성할 수 있고 다른 GC 에 비해 상대적으로 낮은 메모리 오버헤드를 가지고 있습니다. 이런 얘기만 들으면 "이제 Java 애플리케이션은 무조건 ZGC 를 쓰면 되는게 아닌가?" 라는 생각을 하실 수 있는데요, ZGC 의 단점은 큰 힙 크기와 많은 객체 할당을 요구하는 애플리케이션에 특화된 GC 다보니 오히려 작은 힙 크기를 가지는 애플리케이션에서는 스레드 로컬 마킹 스택의 사용으로 인해 높은 오버헤드가 발생할 수 있어 적합하지 않습니다. 또한 ZGC 의 경우 Linux 커널을 사용하는 환경에서 물리 메모리와 가상 메모리를 맵핑할 때 mmap 을 사용하게 되는데요, mmap 은 커널의 maxmapcount 설정만큼 실행할 수 있기 때문에 사용하는 heap 메모리에 맞게 적절한 maxmapcount 를 설정해야하는 주의사항이 있습니다. ZGC 에 관심이 있거나 좀더 자세히 알고 싶으신 분들은 공유드린 D2 블로그에 메모리 구조나 처리흐름에 대해 자세히 정리되어 있으니 한번 읽어보시면 좋겠습니다. 📚 원문 - https://d2.naver.com/helloworld/0128759

알림

알림이 없습니다