Graal and JDK11
Paul Woegerer
paul.woegerer at oracle.com
Fri Apr 19 08:52:34 UTC 2019
A while back I added support for Java 11 based image building into native image.
https://github.com/oracle/graal/commit/ed5f5f82d2962e5f65b3ee784a0cd62c489c41c5
Since then we build images on Java 11 as part of our regular gate tasks. E.g. See:
https://travis-ci.org/oracle/graal/jobs/521993959
If you checkout master and run:
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> cat Hello.java
public class Hello {
public static void main(String[] args) {
var javaVersion = System.getProperty("java.version");
System.out.println("Hello Java " + javaVersion);
}
}
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+7)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+7, mixed mode, sharing)
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> javac Hello.java
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> mx native-image Hello
[hello:19205] classlist: 1,607.95 ms
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.oracle.svm.core.jdk.FileTypeDetectorFeature (file:/home/pwoegere/OLabs/git/svm-master/graal/substratevm/mxbuild/dists/jdk9/svm.jar) to field java.nio.file.Files$FileTypeDetectors.installedDetectors
WARNING: Please consider reporting this to the maintainers of com.oracle.svm.core.jdk.FileTypeDetectorFeature
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[hello:19205] (cap): 854.96 ms
[hello:19205] setup: 1,985.61 ms
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to jdk.internal.misc.Unsafe.objectFieldOffset(Class, String) was detected in the static initializer of jdk.internal.misc.InnocuousThread. Detailed failure reason(s): Could not determine the field where the value produced by the call to jdk.internal.misc.Unsafe.objectFieldOffset(Class, String) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store.
Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to jdk.internal.misc.Unsafe.objectFieldOffset(Class, String) was detected in the static initializer of jdk.internal.misc.InnocuousThread. Detailed failure reason(s): Could not determine the field where the value produced by the call to jdk.internal.misc.Unsafe.objectFieldOffset(Class, String) for the field offset computation is stored. The call is not directly followed by a field store or by a sign extend node followed directly by a field store.
[hello:19205] (typeflow): 6,324.79 ms
[hello:19205] (objects): 6,154.23 ms
[hello:19205] (features): 245.79 ms
[hello:19205] analysis: 12,930.88 ms
[hello:19205] universe: 318.56 ms
[hello:19205] (parse): 970.05 ms
[hello:19205] (inline): 1,849.87 ms
[hello:19205] (compile): 8,515.67 ms
[hello:19205] compile: 11,999.75 ms
[hello:19205] image: 1,248.74 ms
[hello:19205] write: 155.05 ms
[hello:19205] [total]: 30,392.57 ms
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> ./hello
Hello Java 11.0.2
You can see that overall native-image works reasonably well for Java 11 already.
But there is still work to do.
E.g. currently when you build the "native-image" image on Java 11:
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> mkdir -p svmbuild/native-image-root-11/bin
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> mx native-image --tool:native-image -H:Path=svmbuild/native-image-root-11/bin
[native-image:20223] classlist: 1,238.58 ms
...
[native-image:20223] write: 224.72 ms
[native-image:20223] [total]: 40,393.15 ms
And you try to use it you get:
[master $%=] ~/OLabs/git/svm-master/graal/substratevm> svmbuild/native-image-root-11/bin/native-image --tool:native-image -H:Path=svmbuild/native-image-root-11/bin
Error: Starting image-build server instance failed
Caused by: com.oracle.svm.driver.NativeImage$NativeImageError: Could not determine port for sending image-build requests.
Server stdout/stderr:
Exception in thread "main" com.oracle.svm.core.util.VMError$HostedError: Static field processReaperExecutor of class java.lang.UNIXProcess can't be reset. Underlying exception: java.lang.UNIXProcess
(Though, if you use that "native-image" image with --no-server it works
as expected)
If someone wants to work on Java 11 support while I'm busy with other things I suggest looking at the changes brought in by merge commit
https://github.com/oracle/graal/commit/ed5f5f82d2962e5f65b3ee784a0cd62c489c41c5
and start improving on that.
HTH,
Paul
More information about the graal-dev
mailing list