This PR reduces the Thread-SMR (Safe Memory Reclamation) related cost of 
starting and exiting threads.

Both starting and exiting a thread create a new `ThreadsList` and retire the 
old one. Previously, we used to scan the hazard pointers of all threads when a 
`ThreadsList` was retired. This made the execution cost increasingly higher as 
more threads were started.

This PR tackles the problem in three ways:

1. By not scanning hazard pointers every time a new thread is started. Instead, 
we defer the scanning until either 16 `ThreadsLists` have been retired or the 
retired lists occupy at least 4 MB of memory.
2. We use the scan that is performed when removing a thread to also determine 
if it's safe to delete the thread, and thereby we potentially avoid a costly 
re-scan in `wait_until_not_protected()`.
3. By checking if there is no retired `ThreadsList` that can protect the 
thread, `wait_until_not_protected()` can also avoid a re-scan.

I've run the ThreadStart reproducer that is attached to 
[JDK-8307970](https://bugs.openjdk.org/browse/JDK-8307970). Depending on the 
number of idle threads, the changes in this PR show that threads start up to 
~63% faster (or in other words, a ~39% reduction in time to start a thread).

To go further than this likely requires a major rewrite of the Thread-SMR 
system, which would not be a walk in the park.

Passes tier1-3 tests.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - Added reproducer ThreadStartWithIdleThreads.java
 - Merge branch 'master' into 8307970_thraedstart_is_slow
 - Updated comments for David and Daniel
 - 8307970: Thread.start is slow with large number of threads

Changes: https://git.openjdk.org/jdk/pull/33166/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=33166&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8307970
  Stats: 217 lines in 5 files changed: 213 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/33166.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/33166/head:pull/33166

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

Reply via email to