How to use Application Class-Data Sharing feature of java 10?
There are three essential steps to creating and using an archive with application class-data (for more details, read my post about application class-data sharing):
Creating a list of classes to include in the archive:
java -XX:+UseAppCDS -XX:DumpLoadedClassList=classes.lst -jar app.jar
Creating an archive:
java -XX:+UseAppCDS -Xshare:dump -XX:SharedClassListFile=classes.lst -XX:SharedArchiveFile=app-cds.jsa --class-path app.jar
Using the archive:
java -XX:+UseAppCDS -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar app.jar
Keep the following in mind:
- you can’t use wildcards or exploded JARs for the class path when creating the archive
- the class path used to launch the application must have the one used to create the archive as a prefix
- if you have any problems, use
-Xlog:class+load
(more on-Xlog
) to get more information
The JEP for AppCDS has the example show casing how to add your application classes to shared archive. As for the restrictions, there are few:
- Straight classes (.class) present in directory on class path cannot be added to the shared archive. See this thread.
- Classes loaded by custom class loaders cannot be added to the shared archive. See this thread.
There are other practical considerations to be aware of when using CDS/AppCDS, such as:
- If you update the jar files on the file system, then you will have to recreate the shared archive.
- If you are using Java or JVMTI agent(s) that modify/re-transform/redefine the class file at run-time, then the shared archive won't be useful as the classes will be loaded from the disk since the agents need actual classfile data which I believe is not stored in the shared archive.
Another nice and detailed article on CDS and AppCDS is https://simonis.github.io/cl4cds/.
Author of the article has also written a tool that allows sharing of application classes even if they get loaded by a custom class loaders.
If you are interested in using CDS, you can also try OpenJ9 JVM which has this feature for a long time and is much more mature and complete. Read more about it here.