Azul Intelligence Cloud The Powerful Analytics Solution That Boosts DevOps Efficiency with Insights from Production Java Runtime Data from Any JVM  
Blog chevron_right Java

Changes Included in the Stable release 23.02 of Azul Zing Builds of OpenJDK

Azul Platform Prime is a modern, TCK-compliant Java platform based on OpenJDK, providing low, consistent response latency of your Java workloads, higher total throughput and carrying capacity, faster warm-up, and infrastructure savings, achieved thanks to the C4 pauseless garbage collector, Falcon JIT compiler and other technologies created by Azul. Prime Builds are available in two versions, either for evaluation or production use:

  • Stream Builds: Fast-moving monthly releases (end of the month) that include the latest features and changes in PSU releases. These are free for development and evaluation. The use in production requires an active subscription. Their version number is based on year and month. For instance, “” is the January Stream Build of 2023.
  • Stable Builds: Builds that incorporate only CPUs, PSUs, and Azul Platform Prime critical fixes and do not uptake new features and non-critical enhancements from Stream Builds. Stable Builds are our primary vehicle for delivering time-sensitive bug fixes to customers and are only available to Azul customers. Their version number is based on the Stream Build they originated from. For instance, “22.02.501.0” derived from the February Stream Build of 2022 but already had multiple updates, as the 501 number indicates.

As stream builds happen in a fixed schedule, all changes are included in the release notes. Twice a year (in February and August), a Stream build becomes the new Stable build, providing a new version with many more improvements. In this post, we want to give you an overview of all the combined improvements in the latest Stable release,

Changes Included in

As Stable builds overlap, your system should be on the 22.08-stable line, and there are now 4 months of overlap with the 23.02-stable builds. Let’s look at some of the most significant changes between 22.08 and 23.02 and the changes included in the new Stable Build released on March 27, 2023.

CPU Budgeting

Azul Zulu Prime introduces new CPU budgeting features for the Falcon Tier 2 compiler. CPU Budgeting allows you more control over how many Tier 2 compiler threads the JVM uses at different parts of the JVM’s life. For example, your app may have a “warmup” phase in which resources are initialized, but the application is not handling many actual requests. You can dedicate more threads to the Tier 2 compiler during this warmup phase and set a lower number of threads post-warmup.

It is also possible to specify allocated threads as a percent of available CPU threads rather than only whole numbers of threads. You can therefore use Prime and specify less than one compiler thread on resource-constrained machines. To enable these new features, use the argument -XX:+EnableTier2CompilerBudgeting.

New Falcon CPU Budgeting features are listed in Command Line Options, CPU Budgeting Options.

Extended Support for Cloud Native Compiler supports Cloud Native Compiler (CNC) version 1.6.1. CNC now includes the Profile Log Service, which you can use to read and write ReadyNow profile logs. This simplifies getting ReadyNow profile logs in and out of containers and other environments without persistent storage.

Integrated Support for Azul Vulnerability Detection

In November 2021, Azul launched Azul Vulnerability Detection (AVD), a true game-changer for Java security. It operates differently than other tools and fills critical gaps in detection. It’s a SaaS solution that delivers a continuous understanding of your Java applications and exposure to known vulnerabilities. Inside the JVM, dependencies are listed and can be collected in a central dashboard and API for further analysis, exposing the active vulnerabilities with your Java own and third-party applications.

To enable this functionality and avoid needing an agent, the Azul Zulu Prime JVM contains Connected Runtime Services (CRS) functionality to perform this analysis and send the collected data via a Forwarder to Azul Vulnerability Detection. This functionality is not active by default and needs to be configured.

CPU and PSU Release Security Fixes includes the October 2022 and January 2023 CPU and PSU release security fixes.

JDK 19 Included includes General Availability (GA) release of JDK version 19 for x86_64 systems.

Better Native Memory Monitoring Tools

Native Memory Tracking (NMT) now includes extended information on how the JVM, especially the Falcon compiler, utilizes native memory. To enable “extended tracking,” set LD_PRELOAD=$JAVA_HOME/etc/zing/lib/ in addition to regular NMT flags described in Native Memory Tracking Options and the Oracle documentation.

Falcon JIT Compiler Improvements

Various improvements in the Falcon JIT Compiler:

  • Optimizations to make serialization with Jackson faster.
  • The heuristic that controls when Falcon releases memory by resetting internal caches is now set using an ergonomics heuristic based on the number of Falcon compiler threads, unless specified explicitly. You can adjust the cache reset behavior using the FalconContextReset flag. This is a tradeoff between compilation speed and memory consumption. The more often the caches are reset, the less memory is consumed, but more time is spent rebuilding the caches.
  • Register allocation enhancement that improves code generation for derived pointers around GC safepoints. This allows derived pointers to rematerialize immediately before use instead of after every safepoint. This is beneficial when a pointer is live across many statepoints but has few uses.

General Memory and CPU Utilization Improvements

The Allocation Pacing feature helps reduce peak allocation delays while introducing smaller delays into allocation paths as heap usage approaches the total Java heap committed. By default this feature is disabled, but it can be turned on or off with -XX:+GPGCUseAllocationPacing or -XX:-GPGCUseAllocationPacing. A more detailed explanation is available in our blog post “Explained: Memory Allocation Pacing in Azul Zing Builds of OpenJDK“.

With the October 2022 release of Java 11 and 17, the default calculation of available CPU cores changed, following JDK-8281181. Previously, in some situations, the number of available CPU cores was calculated based on the lower bound defined in the environment. With the change in this release, the lower bound is not used anymore, and the calculation is only based on the upper limit of the environment. If, in container-based systems (for instance Kubernetes), no upper limit is defined, the total number of CPUs on the host machine is read as the upper limit. In case you need to switch back to the previous calculation, add -XX:+UseContainerCpuShares to the Java command line. You can find more info about this topic in the release notes of

Improvements in Garbage Collection Pause Times

JVMTI tag map clearing has been moved outside of safepoint pause by default, resulting in lower GC pauses. This is set by the command line argument ConcurrentJVMTITagMapClearing and is set to true by default.

Azul Platform Prime 22.12, through various changes and updates, has been able to achieve:

  • 10% lower GC CPU usage on Cassandra.
  • Lower amount of GC pauses with hidden classes.

Improved Speed on Aarch64 Systems

Since Azul Platform Prime 23.02, the allocation publication barrier has been optimized for Aarch64 in Falcon. Azul Platform Prime performance on Aarch64 systems improved by 8.5% with this optimization.

Compile Stashing Has Been Disabled by Default

Compile stashing is now disabled by default, even when using ReadyNow. Existing ReadyNow users that want to maintain the same compile stashing behavior as in earlier releases should ensure the -XX:+FalconUseCompileStashing flag is set.

Improved Accuracy of RSS Metric Reported in GC logs

With this improvement, the reported memory usage (C heap usage) in GC log gives more accurate results.

Improved JMX MXBean Metrics

New JMX MXBean metrics replace old metric name below java.lang.GarbageCollector to increase accuracy for GC monitoring added with JDK-8265136: Previously, metric “GPGC New/Old” was providing a sum of GC pauses and concurrent GC duration.

  • This metric is replaced by the following:
    • GPGC New/Old Cycles: duration time in ms of the concurrent GC which runs in parallel to application threads and is not stopping the application.
    • GPGC New/Old Pauses: GC pause time in ms.
  • On Java 11 and 17, the new metrics are enabled by default and the old removed. If you need to switch back to the old metric, add -XX:+GPGCReportLegacyGarbageCollectorMXBean.
  • On Java 8, only the old metric is active by default. To switch to the new metric add -XX:-GPGCReportLegacyGarbageCollectorMXBean.

General Improvements

  • A new command line option AllocCodeCacheInLower2G has been introduced and is set to true by default. This option allocates code cache and related data structures at a virtual address within 2 GB. To allow allocation to higher memory addresses, use -XX:-AllocCodeCacheinLower2G. This option is only available for x86_64 systems.
  • The output format for -Xlog:safepoint has been changed to match OpenJDK for JDK13 and above.


As with every release of a new Stable Azul Zulu Prime Build of OpenJDK, many improvements and fixes are included to bring a more performant and secure runtime to your environment.