ClassLoader Leak via Executors.newSingleThreadExecutor(...)

Alan Bateman alan.bateman at oracle.com
Tue Jul 15 10:50:20 UTC 2025


On 11/07/2025 15:42, Chris Dennis wrote:
> Hi All,
>
> I believe I've identified a bug in 
> Executors.AutoShutdownDelegatedExecutorService that can trigger a 
> classloader leak even in the presence of "correct" Executor 
> lifecycling. AutoShutdownDelegatedExecutorService only unlinks the 
> PhantomReference used for cleanup handling when it is shutdown via the 
> shutdown() method. If an Executor wrapped in this way is instead 
> shutdown using the shutdownNow() method and it references a 
> classloader via an injected attribute: ThreadFactory, AbortPolicy, 
> etc. then the cleanup action will reference the classloader, and the 
> classloader will remain strongly referenced. Adding an additional 
> override as shown in the attached patch is sufficient to fix the leak 
> in my testing.
>
It would be useful if you could say more about the scenario. The cleaner 
should execute once the executor service is eligible to be GC'ed and the 
reference is queued. Invoking shutdown just means it is early 
unregistered. So I'm wondering if your issue is more about timing in 
that it's not being GC'ed in a timely manner.

-Alan


More information about the core-libs-dev mailing list