Companion module for the rewritten post 'Virtual Threads on Spring Boot 4.1: The Benchmarks, Re-Run, and the Pinning Advice That Expired', retitled and re-benchmarked on Boot 4.1.1 / JDK 25.0.4.1 (the original post was written against Boot 3.4 / JDK 21). Covers: I/O-bound and CPU-bound throughput (platform vs virtual threads, including a JIT-warmup benchmarking bug this build caught and fixed), JEP 491 proof that synchronized no longer pins a virtual thread's carrier across a blocking call as of JDK 24 (obsoleting the old avoid-synchronized advice), proof that -Djdk.tracePinnedThreads=full is inert on JDK 25, and JEP 506's finalized ScopedValue API (JDK 25 GA, no --enable-preview, and a different shape than the old preview API). Kept as its own module rather than a new top-level repository, alongside the existing async/ module, which already has a stronger dual-JDK JEP 491 proof that this module's docs cross-link to instead of duplicating.
9 lines
630 B
Plaintext
9 lines
630 B
Plaintext
CPU-bound endpoint (/cpu, 20,000x SHA-256), concurrency=60, 2 vCPU sandbox, Spring Boot 4.1.1 / JDK 25.0.4.1
|
|
============================================================================================================
|
|
platform threads : total=60 success=60 wall=208ms p50=130ms p99=202ms
|
|
virtual threads : total=60 success=60 wall=201ms p50=187ms p99=196ms
|
|
|
|
a CPU-bound virtual thread never yields -- it stays mounted on its carrier for the full
|
|
computation, so it competes for the same 2 physical cores a platform thread would. Expect
|
|
these two wall times to be close, not virtual threads winning decisively as in the I/O case.
|