JDK-8250548 : libgraal can deadlock in -Xcomp mode
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: 11,15,15.0.1,16
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2020-07-24
  • Updated: 2021-01-04
  • Resolved: 2020-07-25
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 15 JDK 16
11.0.10-oracleFixed 15.0.1Fixed 16 b08Fixed
Description
JDK-8248168 (https://hg.openjdk.java.net/jdk/jdk/rev/561a1d66a4fd) fixed a regression that caused jargraal to deadlock in certain conditions when running with -Xcomp. Unfortunately, the fix allowed the same deadlock to still occur when using libgraal. Here's an example of such a deadlock:

"main" #1 prio=5 os_prio=31 cpu=325.55ms elapsed=199.38s tid=0x00007ffa65808a00 nid=0x1903 waiting on condition  [0x0000700003c45000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.StringUTF16.compress(java.base@16-internal/StringUTF16.java:179)
	at java.lang.StringUTF16.compress(java.base@16-internal/StringUTF16.java:162)
	at java.lang.String.<init>(java.base@16-internal/String.java:3628)
	at java.lang.String.<init>(java.base@16-internal/String.java:269)
	at jdk.internal.jimage.ImageStringsReader.stringFromByteBuffer(java.base@16-internal/ImageStringsReader.java:250)
	at jdk.internal.jimage.BasicImageReader.getString(java.base@16-internal/BasicImageReader.java:334)
	at jdk.internal.jimage.ImageStringsReader.get(java.base@16-internal/ImageStringsReader.java:51)
	at jdk.internal.jimage.ImageLocation.verify(java.base@16-internal/ImageLocation.java:158)
	at jdk.internal.jimage.BasicImageReader.findLocation(java.base@16-internal/BasicImageReader.java:273)
	- locked <0x0000000127847bf0> (a jdk.internal.jimage.ImageReader$SharedImageReader)
	at jdk.internal.jimage.ImageReader.findLocation(java.base@16-internal/ImageReader.java:148)
	at jdk.internal.module.SystemModuleFinders$SystemModuleReader.findImageLocation(java.base@16-internal/SystemModuleFinders.java:428)
	at jdk.internal.module.SystemModuleFinders$SystemModuleReader.find(java.base@16-internal/SystemModuleFinders.java:437)
	at jdk.internal.loader.BuiltinClassLoader$2.run(java.base@16-internal/BuiltinClassLoader.java:432)
	at jdk.internal.loader.BuiltinClassLoader$2.run(java.base@16-internal/BuiltinClassLoader.java:427)
	at java.security.AccessController.executePrivileged(java.base@16-internal/AccessController.java:784)
	at java.security.AccessController.doPrivileged(java.base@16-internal/AccessController.java:554)
	at jdk.internal.loader.BuiltinClassLoader.findMiscResource(java.base@16-internal/BuiltinClassLoader.java:426)
	at jdk.internal.loader.BuiltinClassLoader.findResource(java.base@16-internal/BuiltinClassLoader.java:310)
	at jdk.internal.loader.BootLoader.findResource(java.base@16-internal/BootLoader.java:180)
	at java.lang.ClassLoader.getResource(java.base@16-internal/ClassLoader.java:1407)
	at java.lang.ClassLoader.getResource(java.base@16-internal/ClassLoader.java:1405)
	at org.dacapo.harness.Benchmark.getURL(Benchmark.java:544)
	at org.dacapo.harness.Benchmark.extractFileResource(Benchmark.java:596)
	at org.dacapo.harness.Benchmark.prepareJars(Benchmark.java:229)
	at org.dacapo.harness.Benchmark.initialize(Benchmark.java:211)
	at org.dacapo.harness.Benchmark.<init>(Benchmark.java:184)
	at org.dacapo.harness.Benchmark.<init>(Benchmark.java:194)
	at org.dacapo.harness.Pmd.<init>(Pmd.java:31)
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(java.base@16-internal/Native Method)
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(java.base@16-internal/NativeConstructorAccessorImpl.java:64)
	at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(java.base@16-internal/DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstanceWithCaller(java.base@16-internal/Constructor.java:500)
	at java.lang.reflect.Constructor.newInstance(java.base@16-internal/Constructor.java:481)
	at org.dacapo.harness.TestHarness.runBenchmark(TestHarness.java:211)
	at org.dacapo.harness.TestHarness.main(TestHarness.java:171)
	at Harness.main(Harness.java:17)


"JVMCI-native CompilerThread2" #13 daemon prio=9 os_prio=35 cpu=41.27ms elapsed=199.11s tid=0x00007ffa7580c000 nid=0x6503 waiting for monitor entry  [0x0000700004e71000]
   java.lang.Thread.State: BLOCKED (on object monitor)
   Compiling:  312    b  4       java.lang.StringUTF16::compress (50 bytes)
	at jdk.internal.jimage.BasicImageReader.findLocation(java.base@16-internal/BasicImageReader.java:253)
	- waiting to lock <0x0000000127847bf0> (a jdk.internal.jimage.ImageReader$SharedImageReader)
	at jdk.internal.jimage.ImageReader.findLocation(java.base@16-internal/ImageReader.java:148)
	at jdk.internal.module.SystemModuleFinders$SystemModuleReader.findImageLocation(java.base@16-internal/SystemModuleFinders.java:428)
	at jdk.internal.module.SystemModuleFinders$SystemModuleReader.read(java.base@16-internal/SystemModuleFinders.java:464)
	at jdk.internal.loader.BuiltinClassLoader.defineClass(java.base@16-internal/BuiltinClassLoader.java:772)
	at jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(java.base@16-internal/BuiltinClassLoader.java:705)
	at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@16-internal/BuiltinClassLoader.java:630)
	- locked <0x000000012a1c0e60> (a java.lang.Object)
	at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@16-internal/BuiltinClassLoader.java:665)
	at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@16-internal/BuiltinClassLoader.java:634)
	- locked <0x000000012a1c0dc0> (a java.lang.Object)
	at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@16-internal/BuiltinClassLoader.java:604)
	at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@16-internal/ClassLoaders.java:168)
	at java.lang.ClassLoader.loadClass(java.base@16-internal/ClassLoader.java:522)

The main thread above is blocked while waiting to be compiled by libgraal. It assumes that libgraal cannot trigger class loading. Ideally, that should be true but we're not quite there yet as can be seen by the stack for the "JVMCI-native CompilerThread2".
Comments
This fix should be pushed into 15.0.1 too.
04-08-2020

Fix Request for JDK 15 update. It is important fix to avoid deadlock when running GraalVM and Metropolis project with libgraal. Changes are libgraal specific and very small (removed incorrect check). They don't affect production Java application execution. Tested in Mach5 running Graal tests. The fix is pushed into JDK 16 and 11u already. Review: https://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2020-July/039176.html Fix: /src/hotspot/share/compiler/compileBroker.cpp @@ -1655,7 +1655,7 @@ bool free_task; #if INCLUDE_JVMCI AbstractCompiler* comp = compiler(task->comp_level()); - if (!UseJVMCINativeLibrary && comp->is_jvmci() && !task->should_wait_for_compilation()) { + if (comp->is_jvmci() && !task->should_wait_for_compilation()) { // It may return before compilation is completed. free_task = wait_for_jvmci_completion((JVMCICompiler*) comp, task, thread); } else
31-07-2020

ILW = Same as JDK-8248168 = P3
27-07-2020

URL: https://hg.openjdk.java.net/jdk/jdk/rev/d7c82394c54c User: dnsimon Date: 2020-07-25 06:42:01 +0000
25-07-2020