Java21에 나온 ZGC-Generation적용해보기
요즘 자바최적화란 서적을 읽고 있다.
가비지컬렉터에 대한 얘기가 나오는데, Java21에서 Generation-ZGC가 나오게 되면서 많은 개선이 있었으니 기본 G1GC에서고성능 실시간 처리, 비동기처리, 로그 수집등의 경우 ZGC를 고려해보는 것도 좋지않나해서 마침 지금 만들고 있는 프로젝트에 적용해볼까한다. 지금 적용해보는 프로젝트는 외부와 통신도 많고 WebFlux로 구성되다보니 비동기 처리할 일도 많다. 또한 소켓연결을 통한 실시간처리도 필요한 부분도 있어서 활용하면 좋겠다 생각했다.
적용법
간단하다. JVM옵션에
-XX:+UseZGC -XX:+ZGenerational -Xlog:gc
이렇게 적어주면 된다. 다만 -Xlog:gc
는 내가 실행되었는지 여부를 파악하기 위해 추가한 것이므로 필요없으면 적지 않아도 된다.
성공적으로 실행되면
[0.006s][info][gc] Using The Z Garbage Collector
[0.580s][info][gc] GC(0) Major Collection (Metadata GC Threshold)
[0.615s][info][gc] GC(0) Major Collection (Metadata GC Threshold) 144M(4%)->60M(1%) 0.036s
이런식으로 로그가 출력될 것이다.
이제 한 한 달간 써보고 될 수 있으면 후기를 남겨보도록 하겠다. G1과 비교하고 싶지만 이를 비교해가는건 정말 어려울 것 같고 별 일이 없으면 잘 적용된 거 아닐까 싶다.
모니터링을 하기 위해서 grafana + prometheus를 사용하였고,
https://grafana.com/grafana/dashboards/4701-jvm-micrometer/
JVM (Micrometer) | Grafana Labs
JVM (Micrometer) A dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut). Features JVM memoryProcess memory (provided by micrometer-jvm-extras)CPU-Usage, Load, Threads, Thread States, File Descriptors, Log EventsJVM Memory Pools
grafana.com
이 지표를 사용하였다.