RFR: 8377597: [Leyden] Improve peak performance when AOT code is used [v2]
Vladimir Kozlov
kvn at openjdk.org
Thu Feb 12 17:32:34 UTC 2026
On Thu, 12 Feb 2026 01:43:27 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:
>> Currently some AOT code could be used for long time after startup. It could case peak performance regression because AOT code is conservative and have several restrictions on optimizations it can do.
>>
>> Introduce AOT code entry counter to request JIT compilation and replace AOT code after some threshold is reached. Use invocation count of C2 code during training run as threshold for AOT code replacement during production run.
>>
>> The counts collected during training run are scaled based on hyperbolic saturation curve formula:
>>
>>
>> int scaled_limit = (AOTCodeInvokeBase + limit / (1.0 + limit / (100000.0 * AOTCodeInvokeScale)));
>>
>> where `AOTCodeInvokeBase` (default 100.) and `AOTCodeInvokeScale` (default 1.) are diagnostic flags.
>> This scaling limits threshold to 100K for higher counts.
>>
>> Here some results running JavacBanch JMH benchmark on linux-x64 (numactl -C 0-3 -m 0`)
>>
>>
>> java -jar javac.jar -f 1 -bm ss -wi 0 -i 100 JavacBench.helloWorld1k
>>
>>
>> <img width="781" height="466" alt="Screenshot 2026-02-10 at 1 25 30 PM" src="https://github.com/user-attachments/assets/58d973bf-9881-45d9-acb8-40b18ca02a06" />
>>
>>
>> <img width="486" height="178" alt="Screenshot 2026-02-10 at 1 22 24 PM" src="https://github.com/user-attachments/assets/19fff702-2302-4e43-a093-5c6981a069ba" />
>>
>> ...
>> <img width="479" height="153" alt="Screenshot 2026-02-10 at 1 24 09 PM" src="https://github.com/user-attachments/assets/72e9d81d-bce2-482c-aaea-a32a192a8899" />
>
> Vladimir Kozlov has updated the pull request incrementally with one additional commit since the last revision:
>
> Address comments
> One immediate question I have about this: does this mean AOT code now has a multi-threaded contention on the counter updated at method entry?
Counters increment is not synchronized and not atomic. Which is similar to other profiling counters we have.
The only contention is present when compilation request is processed to create compilation task and put it on queue (that is synchronized). To request only once from AOT code another counter is used and checked for =0 when calling to CompileBroker.
-------------
PR Comment: https://git.openjdk.org/leyden/pull/110#issuecomment-3892291202
More information about the leyden-dev
mailing list