RFR: 8340547: Starting many threads can delay safepoints

Oli Gillespie ogillespie at openjdk.org
Fri Sep 20 15:36:04 UTC 2024


Mitigate the impact of JVM_StartThread on safepoint synchronization, by adding a new ThreadStart_lock which limits the number of JVM_StartThread invocations competing for Threads_lock at any given time to 1.
This gives a VM thread trying to call a safepoint a much better chance of acquiring Threads_lock when there are many JVM_StartThread invocations in flight, at the cost of one extra lock/unlock for every new thread.

Can be disabled with new diagnostic flag `-XX:-UseExtraThreadStartLock`.

Before (ThreadStartTtsp.java is shared in JDK-8340547):

java -Xlog:safepoint ThreadStartTtsp.java | grep -o 'Reaching safepoint: [0-9]* ns'
Reaching safepoint: 1291591 ns
Reaching safepoint: 59962 ns
Reaching safepoint: 1958065 ns
Reaching safepoint: 14456666258 ns <-- 14 seconds!
...


After:

java -Xlog:safepoint ThreadStartTtsp.java | grep -o 'Reaching safepoint: [0-9]* ns'
Reaching safepoint: 214269 ns
Reaching safepoint: 60253 ns
Reaching safepoint: 2040680 ns
Reaching safepoint: 3089284 ns
Reaching safepoint: 2998303 ns
Reaching safepoint: 4433713 ns <-- 4.4ms
Reaching safepoint: 3368436 ns
Reaching safepoint: 2986519 ns
Reaching safepoint: 3269102 ns
...



**Alternatives**

I considered some other options for mitigating this. For example, could we reduce the time spent holding the lock in StartThread? Most of the time is spent managing the threads list for ThreadSMR support, and each time we add a thread to that list we need to copy the whole list and free every entry in the original, which is slow. But I didn't see an easy way to avoid this.
I also looked at some kind of signal from the VM thread that it is ready to start synchronizing that StartThread could check before trying to grab Threads_lock, but I didn't find anything better than this extra lock.

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

Commit messages:
 - Remove unused code
 - Improve ttsp while creating threads

Changes: https://git.openjdk.org/jdk/pull/21111/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21111&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8340547
  Stats: 15 lines in 4 files changed: 12 ins; 1 del; 2 mod
  Patch: https://git.openjdk.org/jdk/pull/21111.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21111/head:pull/21111

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


More information about the hotspot-dev mailing list