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
