Potential OSR-related performance issue in jdk21

Dean Long dean.long at oracle.com
Sat Nov 15 02:54:01 UTC 2025


It wouldn't hurt to file a bug.  If the same method keeps getting 
compiled over and over then it would be good to find out why. Some flags 
that might help: -XX:+PrintCompilation -XX:+LogCompilation and also 
maybe -XX:+TraceDeoptimization.  It could be OSR if 
DispatchThread.run()+788 is a branch, or just a regular compile if it is 
a method call.

dl

On 11/14/25 12:28 AM, Wojciech KUDLA wrote:
>
> Hi,
>
> (Somehow this message didn’t make it through to hotspot-compiler-dev, 
> so trying here)
>
>
> We’ve observed a strange performance issue within our 
> latency-sensitive application when running on jdk21 (tested with 
> 21.0.3 and 21.0.8).
> The impacted threads are pinned to their respective isolated cores so 
> not expected to experience any disruptions with the exception of a 
> regular hrtick but that executes in user context and is always a 
> sub-microsecond thing.
> First, we noticed that these threads started showing voluntary context 
> switching. Since we avoid any non-vdso syscalls this was a strong 
> indicator of some unintended locking going on and so we decided to 
> capture user- and kernel-space stack traces for one such thread with a 
> bit of eBPF.
> It looks like we go into this death loop of OSRs (the only type of 
> compilation activity known to me to halt execution on the impacted 
> thread) and this happens tens of times per second.
> Here’s the stack traces:
>
> ustack:
>
> __lll_unlock_wake+26
>
> CompileBroker::compile_method(methodHandle const&, int, int, 
> methodHandle const&, int, CompileTask::CompileReason, JavaThread*)+85
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_trace_enter+686
>
> syscall_trace_enter+686
>
> do_syscall_64+326
>
> entry_SYSCALL_64_after_hwframe+102
>
> ustack:
>
>        __lll_unlock_wake+26
>
> CompileBroker::compile_method(methodHandle const&, int, int, 
> methodHandle const&, int, CompileTask::CompileReason, JavaThread*)+85
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_slow_exit_work+179
>
> syscall_slow_exit_work+179
>
> do_syscall_64+365
>
> entry_SYSCALL_64_after_hwframe+102
>
> ustack:
>
> __lll_unlock_wake+26
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_trace_enter+686
>
> syscall_trace_enter+686
>
> do_syscall_64+326
>
> entry_SYSCALL_64_after_hwframe+102
>
> ustack:
>
> __lll_unlock_wake+26
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_slow_exit_work+179
>
> syscall_slow_exit_work+179
>
> do_syscall_64+365
>
> entry_SYSCALL_64_after_hwframe+102
>
> ustack:
>
> __lll_lock_wait+29
>
> DirectivesStack::getMatchingDirective(methodHandle const&, 
> AbstractCompiler*)+50
>
> CompileBroker::compile_method(methodHandle const&, int, int, 
> methodHandle const&, int, CompileTask::CompileReason, JavaThread*)+85
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_trace_enter+686
>
> syscall_trace_enter+686
>
> do_syscall_64+326
>
> entry_SYSCALL_64_after_hwframe+102
>
> ustack:
>
> __lll_lock_wait+29
>
> DirectivesStack::getMatchingDirective(methodHandle const&, 
> AbstractCompiler*)+50
>
> CompileBroker::compile_method(methodHandle const&, int, int, 
> methodHandle const&, int, CompileTask::CompileReason, JavaThread*)+85
>
> CompilationPolicy::compile(methodHandle const&, int, CompLevel, 
> JavaThread*)+456
>
> CompilationPolicy::event(methodHandle const&, methodHandle const&, 
> int, int, CompLevel, CompiledMethod*, JavaThread*)+553
>
> InterpreterRuntime::frequency_counter_overflow_inner(JavaThread*, 
> unsigned char*)+331
>
> InterpreterRuntime::frequency_counter_overflow(JavaThread*, unsigned 
> char*)+27
>
> Interpreter+15968
>
>         void 
> com.hsbc.efx.actor.dispatcher.SingleThreadDispatcher$DispatchThread.run()+788
>
> kstack:
>
> syscall_slow_exit_work+179
>
> syscall_slow_exit_work+179
>
> do_syscall_64+365
>
> entry_SYSCALL_64_after_hwframe+102
>
> This usually starts happening a few minutes after we start the 
> application, probably long enough to reach compilation thresholds. It 
> can last for few to tens of minutes after which it might fix itself 
> and all this activity disappears.
> This does not happen on any jdk17 version that we used. My gut feeling 
> is some sort of a live lock somewhere in the profiler? We have limited 
> means of reproducing it due to environment constraints but if you’d 
> like us to run with some extra flags or on a fast debug build, we 
> could arrange that.
> Also, I’m OpenJDK author with access to the bug tracker if you think 
> we should create and issue for this.
>
> Thanks
>
> *Wojciech KUDLA*
>
> eFX eRisk Infrastructure
> *HSBC Bank plc*
> 8 Canada Square, London E14 5HQ
> Telephone: +44 (0)203 359 3827
> Mobile: +44 7895 833 903
> E-mail: wojciech.kudla at hsbc.com <mailto:wojciech.kudla at hsbc.com>
>
>
> PUBLIC
>
> ------------------------------------------------------------------------
> -SAVE PAPER - THINK BEFORE YOU PRINT!
>
> This E-mail is confidential.
>
> It may also be legally privileged. If you are not the addressee you 
> may not copy,
> forward, disclose or use any part of it. If you have received this 
> message in error,
> please delete it and all copies from your system and notify the sender 
> immediately by
> return E-mail.
>
> Internet communications cannot be guaranteed to be timely secure, 
> error or virus-free.
> The sender does not accept liability for any errors or omissions.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-dev/attachments/20251114/adf0ef84/attachment-0001.htm>


More information about the hotspot-dev mailing list