<div dir="ltr">Hi,<br><br>The startup of a Spring Boot applications involves common auto-configuration checks which would definitely benefit from negative lookup caching at the ClassLoader level, quickly indicating which parts of the infrastructure are not present at runtime.<br>Spring AOT optimizations can precompute those checks, but involve side effects and constraints that probably mean we won't enable them by default for the foreseeable future. The Spring codebase also contains various class presence checks like the ones in WebMvcConfigurationSupport [1] that will be performed regardless of Spring AOT optimizations, with typically more negative lookups than positive ones.<br><br>Best regards,<br>Sébastien Deleuze<br><br>[1] <a href="https://github.com/spring-projects/spring-framework/blob/7e511931b305edc84eb04a219c277a6c8fdcba59/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java#L213-L227">https://github.com/spring-projects/spring-framework/blob/7e511931b305edc84eb04a219c277a6c8fdcba59/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java#L213-L227</a><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 16, 2024 at 5:57 PM David Lloyd <<a href="mailto:david.lloyd@redhat.com">david.lloyd@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">On Thu, Jan 11, 2024 at 4:15 PM John Rose <<a href="mailto:john.r.rose@oracle.com" target="_blank">john.r.rose@oracle.com</a>> wrote:</span><br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>


<div><div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto"><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">[...] </span>But, a <em>failed</em> lookup is not recorded anywhere.  So every distinct lookup must start again from first principles and fail all over again.  For some workloads this costs a small but measurable percentage of startup time.</p>
<p dir="auto">The story is different for the local <code style="margin:0px;padding:0px 0.4em;border-radius:3px;background-color:rgb(247,247,247)">CONSTANT_Class</code> entries in any given classfile:  The JVMS mandates that both successful and failed lookups are recorded on the first attempt (per CP entry per se, not globally and not per class).  Global usage includes both use of <code style="margin:0px;padding:0px 0.4em;border-radius:3px;background-color:rgb(247,247,247)">Class.forName</code> and the “back end” logic for CP entry resolution.  CP resolution is performed at most once per CP entry, and (win or lose) is made sticky on the CP itself, locally.</p>
<p dir="auto">To <span class="gmail_default" style="font-family:arial,helvetica,sans-serif">s</span>ummarize, we can say that, for class lookup, both success and failure are “sticky” locally, and success is “sticky” globally, but failure is “not sticky” globally.</p></div></div></div></blockquote><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">We have implemented a negative lookup cache in the past in certain of our middleware products' custom class loaders, and while they *can* help, I seem to recall that we had some trouble with cache explosion in some scenarios involving certain frameworks. We abandoned that approach quite a long time ago though in favor of a more optimized index-by-package scheme which ensures that all lookups, success or failure, run in (more or less) constant time, which had essentially eliminated the issue for us for that use case.</div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">FWIW I do think that it could be potentially nifty to constant-fold negative lookup cases where that is possible.</div><br></div><div><br></div></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">- DML • he/him<br></div></div></div>
</blockquote></div>

<br>
<span style="background-color:rgb(255,255,255)"><font size="2">This electronic communication and the information and any files transmitted with it, or attached to it, are confidential and are intended solely for the use of the individual or entity to whom it is addressed and may contain information that is confidential, legally privileged, protected by privacy laws, or otherwise restricted from disclosure to anyone else. If you are not the intended recipient or the person responsible for delivering the e-mail to the intended recipient, you are hereby notified that any use, copying, distributing, dissemination, forwarding, printing, or copying of this e-mail is strictly prohibited. If you received this e-mail in error, please return the e-mail to the sender, delete it from your computer, and destroy any printed copy of it.</font></span>