Why Upgrading to JDK 17 with ZGC Is Essential for Low‑Latency Services
This article explains how ZGC in JDK 17 eliminates long GC pauses, compares performance and CPU usage against G1, outlines upgrade reasons, suitable scenarios, and provides step‑by‑step installation and JVM tuning instructions for production Java back‑ends.
Background TL;DR
Garbage‑collector pause times are a critical pain point for services that require real‑time response; traditional collectors like CMS and G1 can pause for tens to hundreds of milliseconds, and tuning them is difficult. ZGC, introduced experimentally in JDK 11 and production‑ready in JDK 15, solves this problem, and JDK 17 is the first LTS version that fully supports it.
Why Upgrade to JDK 17
Supports heap sizes from 8 MB to 16 TB
Maximum GC pause of 10 ms
Throughput may drop up to 15 % in worst cases (often less)
Low‑latency business needs demand millisecond‑level GC pauses. In Meituan’s Zeus service, ZGC reduced TP999 latency by 12–142 ms (18‑74 %) and TP99 by 5–28 ms (10‑47 %).
Additional reasons to upgrade:
Spring Boot 3 requires JDK 17
JIT compiler improvements
New language features such as sealed classes, pattern matching, records
Enhanced security fixes and mechanisms
Applicable Scenarios
Gateway services
Web APIs
Not recommended for batch jobs, scheduled tasks, or CPU‑intensive workloads.
Before‑After Comparison
Environment: 4‑core CPU, 6 GB RAM.
GC Time Comparison
ZGC achieves sub‑millisecond GC pauses, keeping JVM‑induced latency under 1 ms.
CPU Usage Comparison
Running the same code on JDK 17 consumes 10‑20 % more CPU than JDK 8.
Upgrade Method
1. Install JDK 17
# Ubuntu installation
sudo apt install openjdk-17-jdk
# Docker base images
docker pull openjdk:17-slim
docker pull openjdk:17-jdk-oraclelinux7
FROM openjdk:17-slim2. JVM Parameter Tuning
--add-opens=java.base/java.lang=ALL-UNNAMED \
-Xms1500m -Xmx1500m \
-XX:ReservedCodeCacheSize=256m \
-XX:InitialCodeCacheSize=256m \
-XX:+UnlockExperimentalVMOptions \
-XX:+UseZGC \
-XX:ConcGCThreads=1 -XX:ParallelGCThreads=2 \
-XX:ZCollectionInterval=30 -XX:ZAllocationSpikeTolerance=5 \
-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive \
-Xlog:safepoint,classhisto*=trace,age*,gc*=info:file=/opt/gc-%t.log:time,tid,tags:filecount=5,filesize=50m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/opt/errorDump.hprofParameter Explanation
References
https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html
https://tech.dewu.com/article?id=59
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Java Backend Technology
Focus on Java-related technologies: SSM, Spring ecosystem, microservices, MySQL, MyCat, clustering, distributed systems, middleware, Linux, networking, multithreading. Occasionally cover DevOps tools like Jenkins, Nexus, Docker, and ELK. Also share technical insights from time to time, committed to Java full-stack development!
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
