On Mon, 14 Jul 2025 15:49:04 GMT, Chris Dennis <[email protected]> wrote:

> Executors shutdown via `shutdownNow()` should have their cleanables cleaned 
> to prevent a classloader leak. This can happen if a classloader exists that 
> both references the wrapped executor and is referenced by the delegate 
> executor.
> 
> To quote @Martin-Buchholz:
>> BTW: I find Cleaners much harder to use than old finalize, and it looks like 
>> I'm not the only one!

test/jdk/java/util/concurrent/Executors/AutoShutdown.java line 138:

> 136: 
> 137:         assertTrue(ForceGC.wait(() -> queue.poll() != null));
> 138:         Reference.reachabilityFence(reference);

`reachabilityFence` should be placed in a finally-block as per: 
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ref/Reference.html#reachabilityFence(java.lang.Object)

Suggestion:

        try {
            ClassLoader classLoader = 
Utils.getTestClassPathURLClassLoader(ClassLoader.getPlatformClassLoader());

            ReferenceQueue<?> queue = new ReferenceQueue<>();
            Reference<?> reference = new PhantomReference(classLoader, queue);

            
classLoader.loadClass("AutoShutdown$IsolatedClass").getDeclaredMethod("shutdown",
 Consumer.class).invoke(null, shutdown);
            classLoader = null;

            assertTrue(ForceGC.wait(() -> queue.poll() != null));
        } finally {
            Reference.reachabilityFence(reference);
        }

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/26296#discussion_r2382730005

Reply via email to