If you have been following Jetty’s adoption of Java 9, you might have read that builds using JDK 9 have started being produced. As the release of JDK 9 looms, developers are no doubt already doing everything they can to test their current implementations and platforms against the available early-access builds.
Here at Webtide, we are no different. We’ve been testing our website on JDK 9 and are happy to report positive results. That said, switching back and forth between JDKs was not as straight forward as you might think, notably when it comes to setting JVM arguments.
[exec] -Xms512m -Xmx512m -XX:+PrintGCDetails -Xloggc:logs/gc.log
The problem is that
-XX:+PrintGCDetails is no longer valid in JDK 9. Similarly, the
-Xloggc:logs/gc.log has been deprecated (and the new format is not valid for JDK 8).
While we could change the
jvm.mod file to accept the new values for JDK 9, it does not allow for quick switching back to JDK 8 without editing the module file each time, or copy/pasting in a new module file every time we change JVM version.
To combat this, we created a a dynamic module file that loads a dependent module based on what version of the JVM is found at startup using the Jetty
We still define the module as normal in our
... --module=jvm ...
But if we examine our
jvm.mod file we now have:
On startup, once it is determined which version of the Java platform we are running (8 or 9 in this case), it will load one of two module files, either
jvm8.mod file is identical to the file we used at the start of this example. The
jvm9.mod file substitutes in the correct values for JDK 9 so that we do not face errors on startup:
[exec] -Xms512m -Xmx512m -Xlog:gc*:file=logs/gc.log
In this way we were able to switch back and forth between JDK 8 and JDK 9 without having to manually change arguments each time.
We hope this helps you with your own testing!