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