On Thu, 3 Sep 2026 08:31:49 GMT, Per Minborg <[email protected]> wrote:
>> ## Summary >> >> This PR proposes to introduce a pooled confined arena as an optimization for >> `Arena.ofConfined()`, where small native allocations can be served from a >> reusable per-thread memory pool or a local arena pool instead of calling the >> regular native allocator for every short-lived arena. The arena remains >> confined to its owner thread and is still closed normally, but its backing >> storage can be reset and reused when the arena closes. The feature requires >> no API changes. >> >> ### Outline >> >> Platform threads: There are up to eight (four by default) lazily allocated >> pools per Thread, encoded in `Thread.FieldHolder.confinedMemoryPool`. >> Virtual threads: Works in the same way but uses its _carrier thread's _ >> cache instead. >> >> Pooled memory is zeroed out upon _closing_ an Arena to minimize data >> visibility between reuse. This means the data is visible only within a TWR >> block, and never outside it. >> >> A confined arena has access to one, two, four, or eight (four by default) >> platform/carrier thread pools, each of size 64 bytes by default. The pool >> sizes are configurable via an internal unsupported system property and can >> be 8 bytes .. 1 MiB. Pooling can also be turned off completely by setting >> the pool properties to negative values. As there can be up to eight pools >> per thread, nested confined arenas backed by thread-cached pools are >> supported (i.e., up to eight nested arenas). >> >> ## Static Analysis >> >> An extensive static corpus analysis of third-party libraries and the JDK >> itself has been conducted with respect to `Area.ofConfined()` usage, >> revealing that confined arenas were used _only_ in TWR blocks and _never_ in >> an unstructured way. The static analysis further revealed that in most >> cases, only a small amount of native memory was ever allocated, usually less >> than 32 bytes, and in many cases, 8 bytes or less. This usage pattern lends >> itself well to pooling. >> >> ## Dynamic Analysis >> >> A dynamic statistical analysis of actual runs was also made, where various >> properties of confined arenas were recorded and summarized during a complete >> tier1 test run. While a tier1 run is not necessarily representative of a >> typical application workload, it provided some interesting results: Except >> for very large allocations, >99% were smaller than 64 bytes. Almost 50% >> didn't allocate any memory, indicating a lazy approach would pay off. >> >> The above data supports that picking a 64-byte-sized pool would enable most >> allocations to be served from the pool. > ... > > Per Minborg has updated the pull request incrementally with one additional > commit since the last revision: > > Rework thread cleanup Updated Thread.exit is much better, thanks. ------------- Marked as reviewed by alanb (Reviewer). PR Review: https://git.openjdk.org/jdk/pull/31365#pullrequestreview-5101178960
