RFR: 8343704: Bad GC parallelism with processing Cleaner queues [v10]

Aleksey Shipilev shade at openjdk.org
Mon Nov 18 09:41:46 UTC 2024


On Fri, 15 Nov 2024 21:31:54 GMT, Brent Christian <bchristi at openjdk.org> wrote:

>> Aleksey Shipilev has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   prev is not needed
>
> src/java.base/share/classes/jdk/internal/ref/CleanerImpl.java line 310:
> 
>> 308:             }
>> 309:             assert phc.node.arr[phc.index] == phc;
>> 310:             assert head.size > 0;
> 
> I now realize that these assertions in `remove()` won't really "work" because _"exceptions thrown by the cleaning action are ignored"_. :(
> When the cleaner thread removes the phc (`ref.clean()` in `run()` on L142 -> `list.remove()` on PhantomCleanable L94 ), any `AssertionError`s will get lost in `run()`'s `catch` statement, L144.
> 
> (There is a related RFE [JDK-8305979 : UncaughtExceptionHandler for Cleaner](https://bugs.openjdk.org/browse/JDK-8305979))

Ah, true. Yes, this is inconvenient, but I think these asserts are opportunistic to catch internal errors, so they are of interest of JDK testing and catching JDK bugs, not the issues in the user code in Cleaners. I see the asserts would fire from the direct invocation of `clean()`, as deliberately breaking the asserts in `remove()` gets me this failure immediately:


Running test 'jtreg:test/jdk/java/lang/ref'
Directory "/Users/shipilev/Work/shipilev-jdk/build/macosx-aarch64-server-release/test-results/jtreg_test_jdk_java_lang_ref" not found: creating
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.AssertionError
	at java.base/jdk.internal.ref.CleanerImpl$CleanableList.remove(CleanerImpl.java:310)
	at java.base/jdk.internal.ref.PhantomCleanable.clean(PhantomCleanable.java:94)
	at java.base/java.util.zip.ZipFile$ZipFileInflaterInputStream.close(ZipFile.java:416)
	at java.base/java.util.jar.JarFile.getBytes(JarFile.java:803)
	at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1006)
	at java.base/java.util.jar.JarFile.hasClassPathAttribute(JarFile.java:954)
	at java.base/java.util.jar.JavaUtilJarAccessImpl.jarFileHasClassPathAttribute(JavaUtilJarAccessImpl.java:34)
	at java.base/jdk.internal.loader.URLClassPath$JarLoader.getClassPath(URLClassPath.java:922)
	at java.base/jdk.internal.loader.URLClassPath.getLoader(URLClassPath.java:447)
	at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:314)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:757)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:497)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:577)
	at java.base/java.lang.Class.forName(Class.java:556)
	at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:854)
	at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:739)


So I don't regard this as blocking.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22043#discussion_r1846180271


More information about the core-libs-dev mailing list