You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@netbeans.apache.org by Michael Bien <mb...@gmail.com> on 2020/10/05 08:43:48 UTC
Re: NB + DynAppCDS
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: dev-unsubscribe@netbeans.apache.org
For additional commands, e-mail: dev-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists