You might try investigating further with a combination of JFR (JDK Flight Recorder, built-in to the JDK) and the GUI tool JMC (JDK Mission Control, available here: https://adoptium.net/en-GB/jmc/)
I often find it to be significantly more useful than the capabilities of VisualVM. Thanks, Ben On Fri, Oct 25, 2024 at 4:21 PM Packiaraj S <[email protected]> wrote: > > Hello, > > We use Nashorn with Tomcat as a long running service. We recently migrated to > Java 21. ( from java 11 and the performance is good with Java-11). > Since Nashorn is moved out of JDK we have pulled in 'nashorn-core-15.4.jar' > and its dependency (asm*) and loaded it as a regular jar. Functionality > everything looks ok. > > During the performance test we observed very high cpu usage when nashorn > engine's 'eval' is called. The CPU consumption is so high that instances are > throttled and performance becomes 10x slower compared to java-11. > > Upon investigation using profiler (jvisualVM) looks like most of the CPU is > spent in compile method, more specifically during > ContextCodeInstaller.initialize and NamedContextCodeInstaller.install > > Looks like the compile method is optimized with cache, unfortunately the > cache is in context scope, meaning it's not shared between ScriptEngines and > Nashorn is not thread-safe (as per the docs) to use a single instance of > ScriptEngine across all threads. Also the cache uses 'soft-reference', would > it cause double whammy when there is a memory pressure. > > so, how to improve the performance of the Nashorn engine, specifically the > `compile` part. > Is there any other option we can try? BTW, persistent-code-cache did not > help as OptimisticTypesPersistence.getVersionDirName is performing poorly > > Test code that we used to study this high CPU issue is attached. > > Thanks a lot for hemp & any insight > Sakkanan
