I went for another round and this time actually measured startup time with and without DynAppCDS enabled.

just as sidenote:
testing startup time of anything on linux is a bit difficult since the kernel will just keep caching the filesystem (if you have enough RAM) until everything is started out of memory anyway. I am also running everything on NVME storage, this makes random access already really fast. However, there is still a reason why CDS has the potential to speed things up: bytecode verification is basically skipped, it will just run a few signature checks on the archive - the bytecode was already verified during archive creation.

To get a realistic test scenario i used my regular IDE with ~15 projects open. (swapped the boot.jar to make it work) I stopped the time the moment the editor rendered code. (probably not the best way of doing this because there are a lot of concurrent tasks going on during startup, this is certainly not the last)

CDS off, DynAppCDS off: 8.5s
CDS on, DynAppCDS off: 8.1s
CDS on, DynAppCDS on: 7.3s

I ran it 3 times for each setting, individual runs were fairly similar - took the average.

So it is measurably faster even on NVME with warmed up filesystem cache, but you probably won't perceive a 1s startup difference on a desktop app which is taking several seconds to start. You also would have to regenerate the archive every time a plugin is installed or updated or you enter classloading hell.

best regards,
michael


On 26.09.20 16:19, Michael Bien wrote:
Hello,

did anyone try to get CDS working with NetBeans before?

I just ran a little experiment and tried to start NB 12.1 with dynamic class data archives[1][2].

(dynamic CDS (java 13+) is basically a fancy word for a second application specific archive, layered on top of the JDK specific class data archive, which is mapped into shared memory on jvm startup for various reasons. (faster startup, potential of saving mem by sharing it between mult. JVMs etc))

unfortunately i couldn't get it to work at first because NB thought the JDK disappeared as soon the JVM was started with the archive :)


what i did (JDK 15, NB 12.1 on linux, started with "sh bin/netbeans" to see startup errors right away + to be able to use relative filename paths):

0) remove the evil -J-XX:+IgnoreUnrecognizedVMOptions from netbeans.conf->netbeans_default_options before starting any experiment

1) first I verified that the JDK base CDS file exists and is working by adding -J-Xshare:on and checked if it still starts - worked fine. (if this doesn't work, you can regenerate the JDK CDS with "sudo [JDK]/bin/java -Xshare:dump")

2) start with -J-Xshare:on -J-XX:ArchiveClassesAtExit=nb.jsa

Opened a pom, edited a java file and built a maven project. Closed IDE. (the JVM will keep going for a few moments until the archiving is finished)

a file called nb.jsa should be now in the netbeans folder. 154 MB large in my case.

3) start with -J-Xshare:on -J-XX:SharedArchiveFile=nb.jsa

and i got this exception:

[mbien@longbow netbeans_12.1]$ sh bin/netbeans
java.lang.IllegalStateException: Were trying to install a module that had never been checked: StandardModule:org.netbeans.api.debugger.jpda jarFile: /home/mbien/dev/netbeans_12.1/java/modules/org-netbeans-api-debugger-jpda.jar
    at org.netbeans.ModuleManager.enable(ModuleManager.java:1363)
    at org.netbeans.ModuleManager.enable(ModuleManager.java:1254)
    at org.netbeans.core.startup.ModuleList.installNew(ModuleList.java:315)
    at org.netbeans.core.startup.ModuleList.trigger(ModuleList.java:251)
    at org.netbeans.core.startup.ModuleSystem.restore(ModuleSystem.java:298)
    at org.netbeans.core.startup.Main.getModuleSystem(Main.java:156)
    at org.netbeans.core.startup.Main.getModuleSystem(Main.java:125)
    at org.netbeans.core.startup.Main.start(Main.java:282)
    at org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:98)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.netbeans.InvalidException: <b>The JDK is missing and is required to run some NetBeans modules</b><br> Please use the --jdkhome command line option to specify a JDK<br>installation or see <a href="http://wiki.netbeans.org/FaqRunningOnJre";>http://wiki.netbeans.org/FaqRunningOnJre</a> for<br> more information.
    at org.netbeans.ModuleManager.enable(ModuleManager.java:1345)
    ... 9 more

@ https://github.com/apache/netbeans/blob/12.1/platform/o.n.bootstrap/src/org/netbeans/ModuleManager.java#L1345

after staring at the code for a bit i decided to remove the check [3] and test again... and it worked. (Btw i don't think the exception msg text is correct, maybe the check used to do something else once?)

thats when i ran out of time so i thought i write it down and send it to the list.


note1: older JDKs will require slightly different JVM flags e.g additional -XX:+UseAppCDS + the enable experimental options flag, so i recommend to use the latest JDK for now to keep it simple

note2: i did also try the old approach which would work on JDK 11 (JEP 310, java 10+):

1) -J-Xshare:off -J-XX:DumpLoadedClassList=nbclasses.list
2) -J-Xshare:dump -J-XX:SharedClassListFile=nbclasses.list -J-XX:SharedArchiveFile=app.jsa
3) -J-Xshare:on -J-XX:SharedArchiveFile=app.jsa

smaller file but same result


best regards,

michael

[1] https://openjdk.java.net/jeps/350

[2] https://mbien.dev/blog/entry/dynamic-application-class-data-sharing (old blog entry)

[3] https://github.com/apache/netbeans/blob/12.1/platform/o.n.bootstrap/src/org/netbeans/ModuleManager.java#L1336-L1350



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists



Reply via email to