OpenJDK Shenandoah And Time Zone Correctness Notes


OpenJDK landed 93 commits across 441 files in the review window. For data pipeline operators, the useful changes cluster around Shenandoah correctness, time zone rules, startup archives, and core comparison paths rather than headline language work.

The most important collector fix is a remembered set scan correction. A worker processing one heap slice could skip an object whose head started in the previous slice. That assumption was safe with the stable read table, but not with the active write table because the head card could become dirty after the preceding worker had passed it. The new branch scans object references when the write table is in use.

That is a narrow code change with a serious contract behind it. Generational collectors depend on card scanning to retain references across regions and generations. The patch does not claim a known application failure or data loss, so operators should not invent a wider incident. It does remove a path where a dirty card could be missed.

Another card barrier patch stops the assembler from choosing fixed scratch registers that could overwrite the object register. The fix passes explicit temporary registers and asserts that they differ on AArch64, RISC V, and x86. This matters for mixed architecture worker fleets because the correction covers all three back ends in one change.

There is also a limit for large scalarized call signatures. In sharedRuntime.cpp, Shenandoah now caps the scalarized stack argument area at 64 slots instead of 128. That keeps generated entry points within the 16 bit offset stored by an nmethod.

The pinning performance change adds a thread local cache for the current heap region and its pin count. Repeated pins in the same region accumulate locally. The JVM flushes the count to the shared region state when a thread moves to another region, exits, or reaches the relevant safepoint.

The stated goal is to avoid contended atomic updates on the shared pin counter. That is relevant to data services that spend meaningful time in JNI or the Foreign Function and Memory API, especially when many threads pin objects in the same region. The commit includes no benchmark, so there is no defensible throughput number to quote. It also adds cache flush paths that must remain synchronized with pinned region status. Treat this as a promising runtime optimization, not a reason by itself to change collectors.

The tzdata 2026c update is immediately relevant to scheduled pipelines. It models Morocco returning to GMT on September 20, 2026. It also models Alberta at UTC minus six after the November 1 transition, with a temporary representation for the period before that date. Jobs that derive partitions, reporting dates, or trigger times from Africa/Casablanca or America/Edmonton need boundary tests against the JDK build they actually deploy.

CDS dumping also gets a precise path identity fix. The circular manifest patch replaces a text comparison with os::same_files. A cycle such as A.jar pointing to ./B.jar while B.jar points back to A.jar is now recognized by file identity, despite the different path spelling. The regression test expects only two archive paths and carries a 60 second timeout. This should make archive generation more predictable for assembled worker distributions with generated manifests.

The array mismatch refactor makes the public internal helper compare every requested element and return -1 for a full match. The platform intrinsic still reports an unchecked tail through its private result convention, but one wrapper now owns that tail scan. NIO buffers, foreign memory bulk operations, socket addresses, and primitive array helpers no longer repeat the same completion logic. This is mostly internal cleanup, but it reduces the number of callers that can mishandle a partial vector comparison.

The Class File API validation patch rejects unnamed packages and modules where the class format cannot represent them. It also enforces null checks in symbol match operations. The changes reach AbstractPoolEntry.java and add focused builder tests. Bytecode generators used by query engines, agents, and plugin systems should now fail at construction with a clear exception instead of carrying an invalid descriptor farther through the pipeline.

Finally, a JFR event loading guard puts the tracing boolean check before references to file and socket event classes. Tests verify that those classes stay unloaded when JFR is off. This may trim class loading work for short lived jobs, but the patch reports no startup or memory measurements.

  • These commits are on master, not a named release. Check the exact vendor build before changing production expectations.

  • Generational Shenandoah users should track the dirty card and register fixes together, then exercise allocation heavy tests on every deployed CPU architecture.

  • Recheck local time fixtures around September 20 and November 1. Container image updates matter only when the bundled JDK actually carries tzdata 2026c.