Improving AppCDS for Custom Loaders

Ioi Lam ioi.lam at oracle.com
Tue May 1 18:32:36 UTC 2018


PROBLEM:

As discussed with Volker and Yumin in previous e-mails, AppCDS has some 
experimental support for custom class loaders. However, it's not very 
easy to use.

For example, you can write a classlist like this:

     java/lang/Object id: 1
     CustomLoadee id: 2 super: 1 source: /tmp/foo.jar

The CustomLoadee class will be stored in the shared archive with a CRC 
code. During runtime, if a customed loader wants to load a class of the 
same name, and its classfile has the same size and CRC as the archived 
class, the archived version will be loaded. This speeds up class loading 
by avoiding parsing the class file, and saves space by sharing the 
mmap'ed class metadata across processes.

You can see an example test at:

http://hg.openjdk.java.net/jdk/hs/file/46dc568d6804/test/hotspot/jtreg/runtime/appcds/customLoader/HelloCustom.java

However, the current scheme requires you to specify all the super 
classes and interfaces. There's no support provided by the 
-XX:DumpLoadedClassList option.It can be helped somewhat with Volker's 
tool: https://github.com/simonis/cl4cds


POSSIBLE SOLUTIONS:

1. "Dump-as-you-go". As suggested by Yumin, we can provide a jcmd to ask 
a running JVM process to dump all of its loaded classes, including those 
loaded by custom loaders, into an archive. An alternative is to dump the 
archive at JVM exit time (or when you press Ctrl-C, etc.

2. Add information about the custom classes for -XX:DumpLoadedClassList. 
The trouble is some class loaders don't specify a code source that can 
be understood by the built-in class loaders. For example, the "Fat Jars" 
would have a code source like

jar:file:/jdk/tmp/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/validation-api-2.0.1.Final.jar!/

also, many custom loaders would pre-process the classfile data before 
defining the class, so we can't simply archive the version of the class 
on disk.

One possible solution for #2 is to include the class file data in the 
-XX:DumpLoadedClassList output:


java/lang/Object id: 1
     CustomLoadee id: 2 super: 1 source: base64
yv66vgAAADQAFwoABAAQCQAFABEHABIHABMHABQBAAJIaQEADElubmVyQ2xhc3NlcwEABjxpbml0
PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAAFmAQADKClJAQAKU291cmNlRmlsZQEA
CkhlbGxvLmphdmEMAAgACQwAFQAWAQAFSGVsbG8BABBqYXZhL2xhbmcvT2JqZWN0AQAISGVsbG8k
SGkBAAFYAQABSQAhAAMABAAAAAAAAgABAAgACQABAAoAAAAdAAEAAQAAAAUqtwABsQAAAAEACwAA
AAYAAQAAAC8ACAAMAA0AAQAKAAAAHAABAAAAAAAEsgACrAAAAAEACwAAAAYAAQAAADEAAgAOAAAA
     AgAPAAcAAAAKAAEABQADAAYACA==


Of the 2 solutions:

#1 seems easier to use, but may require more invasive modifications in 
the VM, especially if you want to be able to continue execution after 
dumping.

#2 would be easier to implement, but the classlist might be huge.

Also, #2 would allow post-processing tools to remove unneeded classes, 
or merge two runs into a single list. The output of #1 is essentially a 
binary blob that's impossible for off-line analysis/optimizations.


Any comments, or suggestions for alternatives?

Thanks
- Ioi




More information about the hotspot-runtime-dev mailing list