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