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