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