RFR: 8350285: Regression caused by ShenandoahLock under extreme contention
Xiaolong Peng
xpeng at openjdk.org
Wed Feb 19 20:58:04 UTC 2025
We have noticed there is significant regression in at-safepoint time with recent changes made to ShenandoahLock, more specifically this [PR](https://github.com/openjdk/jdk/pull/19570), a local reproducer was written to reproduce the issue, here is the top N at-safepoint time in `ns` comparison:
Tip:
94069776
50993550
49321667
33903446
32291313
30587810
27759958
25080997
24657404
23874338
Tip + reverting [PR](https://github.com/openjdk/jdk/pull/19570)
58428998
44410618
30788370
20636942
15986465
15307468
9686426
9432094
7473938
6854014
Note: command line for the test:
java -Xms256m -Xmx256m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:-ShenandoahPacing -XX:-UseTLAB -Xlog:gc -Xlog:safepoint ~/Alloc.java | grep -Po "At safepoint: \d+ ns" | grep -Po "\d+" | sort -nr
With further digging, we found the real problem is more runnable threads after the [PR](https://github.com/openjdk/jdk/pull/19570) causes longer time for VM_Thread to call disarm wait barrier when leaving safepoint. Fixing in the issue in VM_Thread benefits other GCs as well but it is more complicated(see the details here https://bugs.openjdk.org/browse/JDK-8350324).
With some tweaks in ShenandoahLock, we could mitigate the regression caused by [PR](https://github.com/openjdk/jdk/pull/19570), also improve the long tails of at-saftpoint time by more than 10x, here is the result from the same test with this changes of this PR:
1890706
1222180
1042758
853157
792057
785697
780627
757817
740607
736646
725727
725596
724106
### Other test
- [x] `make test TEST=hotspot_gc_shenandoah`
- [x] Tier 2
-------------
Commit messages:
- Move impl of yield_or_sleep to cpp file
- Address review comments
- Reset yields count to 0 after short sleep
- Merge branch 'openjdk:master' into shenandoah-lock-fix
- Put thread to sleep after it yield up to 5 times to contend for ShenandoahLock w/o luck
Changes: https://git.openjdk.org/jdk/pull/23701/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23701&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8350285
Stats: 16 lines in 2 files changed: 13 ins; 0 del; 3 mod
Patch: https://git.openjdk.org/jdk/pull/23701.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/23701/head:pull/23701
PR: https://git.openjdk.org/jdk/pull/23701
More information about the hotspot-gc-dev
mailing list