Skip to content

[GR-63337] [Native Image] GraalVM 24 deadlocks building with two jar files in the class path when only one CPU is available #10891

Closed
@puni073

Description

@puni073

Describe the Issue

GraalVM 24 taskset -c 0 native-image -cp Main.jar:HelloWorld.jar Main -o MainApp deadlocks.
GraalVM 23.0.2 works.
taskset -c 0,1 or -cp Main.jar works.

Using the latest version of GraalVM can resolve many issues.

GraalVM Version

openjdk version "24" 2025-03-18
OpenJDK Runtime Environment GraalVM CE 24+36.1 (build 24+36-jvmci-b01)
OpenJDK 64-Bit Server VM GraalVM CE 24+36.1 (build 24+36-jvmci-b01, mixed mode, sharing)

Operating System and Version

DISTRIB_ID=Ubuntu DISTRIB_RELEASE=24.04 DISTRIB_CODENAME=noble DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"

Build Command

taskset -c 0 native-image -cp Main.jar:HelloWorld.jar Main -o MainApp

Expected Behavior

Building starts.

Actual Behavior

Building never started and was aborted by the watchdog.

Steps to Reproduce

cat Main.java

public class Main {
    public static void main(String[] args) {
        HelloWorld.sayHello();
    }
}

cat HelloWorld.java

public class HelloWorld {
    public static void sayHello() {
        System.out.println("Hello, World!");
    }
}

javac Main.java
javac HelloWorld.java
jar cf Main.jar Main.class
jar cf HelloWorld.jar HelloWorld.class
taskset -c 0 native-image -cp Main.jar:HelloWorld.jar Main -o MainApp

Additional Context

No response

Build Log Output and Error Messages

Loading classes is taking a long time. This can be caused by class- or module-path entries that point to large directory structures.
Total processed entries: 12324, current entry: jar:file:///judge/hello/HelloWorld.jar!/META-INF
Total processed entries: 12324, current entry: jar:file:///judge/hello/HelloWorld.jar!/META-INF
Total processed entries: 12324, current entry: jar:file:///judge/hello/HelloWorld.jar!/META-INF
Total processed entries: 12324, current entry: jar:file:///judge/hello/HelloWorld.jar!/META-INF
Total processed entries: 12324, current entry: jar:file:///judge/hello/HelloWorld.jar!/META-INF

=== Image generator watchdog detected no activity. This can be a sign of a deadlock during image building. Dumping all stack traces. Current time: Thu Mar 20 01:03:20 UTC 2025
"main" Id=3 in WAITING on lock=java.util.stream.ForEachOps$ForEachTask@6b4ad5f5
    at java.base@24/jdk.internal.misc.Unsafe.park(Native Method)
    at java.base@24/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
    at java.base@24/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:441)
    at java.base@24/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:496)
    at java.base@24/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:662)
    at java.base@24/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:677)
    at java.base@24/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:162)
    at java.base@24/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:176)
    at java.base@24/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:264)
    at java.base@24/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636)
    at java.base@24/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:810)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageClassLoaderSupport$LoadClassHandler.run(NativeImageClassLoaderSupport.java:744)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageClassLoaderSupport.loadAllClasses(NativeImageClassLoaderSupport.java:268)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ImageClassLoader.loadAllClasses(ImageClassLoader.java:88)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:400)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:732)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:151)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:99)

"Reference Handler" Id=7 in RUNNABLE
    at java.base@24/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
    at java.base@24/java.lang.ref.Reference.processPendingReferences(Reference.java:246)
    at java.base@24/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:208)

"Finalizer" Id=8 in WAITING on lock=java.lang.ref.ReferenceQueue$Lock@682e40b3
    at java.base@24/java.lang.Object.wait0(Native Method)
    at java.base@24/java.lang.Object.wait(Object.java:389)
    at java.base@24/java.lang.Object.wait(Object.java:351)
    at java.base@24/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:138)
    at java.base@24/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:229)
    at java.base@24/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:165)

"Signal Dispatcher" Id=9 in RUNNABLE

"Common-Cleaner" Id=14 in TIMED_WAITING on lock=java.lang.ref.ReferenceQueue$Lock@40ab9b6b
    at java.base@24/java.lang.Object.wait0(Native Method)
    at java.base@24/java.lang.Object.wait(Object.java:389)
    at java.base@24/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:124)
    at java.base@24/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:215)
    at java.base@24/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
    at java.base@24/java.lang.Thread.runWith(Thread.java:1460)
    at java.base@24/java.lang.Thread.run(Thread.java:1447)
    at java.base@24/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:148)

"Notification Thread" Id=15 in RUNNABLE

"native-image pid watcher" Id=16 in TIMED_WAITING on lock=java.util.TaskQueue@188c1536
    at java.base@24/java.lang.Object.wait0(Native Method)
    at java.base@24/java.lang.Object.wait(Object.java:389)
    at java.base@24/java.util.TimerThread.mainLoop(Timer.java:569)
    at java.base@24/java.util.TimerThread.run(Timer.java:522)

"Thread-1" Id=17 in RUNNABLE
    at java.management@24/sun.management.ThreadImpl.dumpThreads0(Native Method)
    at java.management@24/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:505)
    at java.management@24/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:493)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.DeadlockWatchdog.threadDump(DeadlockWatchdog.java:135)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.DeadlockWatchdog.reportFailureState(DeadlockWatchdog.java:103)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.DeadlockWatchdog.watchdogThread(DeadlockWatchdog.java:86)
    at app/org.graalvm.nativeimage.builder/com.oracle.svm.hosted.DeadlockWatchdog$$Lambda/0x000000003813cc40.run(Unknown Source)
    at java.base@24/java.lang.Thread.runWith(Thread.java:1460)
    at java.base@24/java.lang.Thread.run(Thread.java:1447)

"pool-2-thread-1" Id=18 in TIMED_WAITING on lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@25548eaf
    at java.base@24/jdk.internal.misc.Unsafe.park(Native Method)
    at java.base@24/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:271)
    at java.base@24/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1802)
    at java.base@24/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1166)
    at java.base@24/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:883)
    at java.base@24/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1021)
    at java.base@24/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
    at java.base@24/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:619)
    at java.base@24/java.lang.Thread.runWith(Thread.java:1460)
    at java.base@24/java.lang.Thread.run(Thread.java:1447)


=== Memory statistics (in MB):
=== Used heap size: 981
=== Free heap size: 908
=== Maximum heap size: 27127
=== Image generator watchdog is aborting image generation. To configure the watchdog, use the options -H:DeadlockWatchdogInterval=10 and -H:+DeadlockWatchdogExitOnTimeout
Error: Image build request for 'MainApp' (pid: 1234, path: /judge/hello) failed with exit status 30

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions