RFR: 8347337: ZGC: String dedups short-lived strings

Stefan Karlsson stefank at openjdk.org
Mon Mar 10 15:24:36 UTC 2025


When -XX:+UseStringDeduplication is turned on, ZGC requests that every single String it encounters is deduplicated. The Strings of these requests are saved in weak handles, and then processed by a separate thread. One problematic part with this is that ZGC treats these handles as strong roots for young collections. So, even if the Strings are short-lived they will be artificially kept alive until they get promoted up to the old generation.

This creates an extreme amount of Strings and weak handles to be processed by the old collection, which can result in long major collections and allocation stalls.

Other GCs have a filter to check for how old the Strings are before they get deduplicated.

The proposed fix is to move the string deduplication requests to when the Strings are promoted to the old generation.

Testing:

* I've tested this with a small micro that showed how ZGC got extremely long major collections with string deduplication turned on.

* SPECjbb2015 with a JVMTI agent that induces load and adds deduplicatable strings.

* Tier1-7

Note: I'm currently not aware of any non-artificial workload where string deduplication is an important optimization when running with Generational ZGC. If anyone knows of a workload that greatly benefits from it *AND* uses ZGC as a low-latency collector, then that would be highly interesting to look at.

Note 2: the branch contains two changesets. In the first changeset I added a flag to be able to test and compare the old implementation with the new implementation. For the final PR I've removed that flag and the associated code as a second changeset. If we really want we could keep that flag, but given how poorly that implementation worked for Generational ZGC, I think we should just go with this new implementation.

-------------

Commit messages:
 - Remove string dedup from marking
 - 8347337: ZGC: String dedups short-lived strings

Changes: https://git.openjdk.org/jdk/pull/23965/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23965&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8347337
  Stats: 151 lines in 6 files changed: 109 ins; 34 del; 8 mod
  Patch: https://git.openjdk.org/jdk/pull/23965.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23965/head:pull/23965

PR: https://git.openjdk.org/jdk/pull/23965


More information about the hotspot-gc-dev mailing list