Just a somewhat "crazy" idea: it seems you are well acquainted with the details and if it turns out that Nashorn is not viable, how about trying to use JavaFX WebKit's JavaScript instead for your purposes? You may be able to implement a ScriptEngine for it that could better serve your needs?

You could check out the documentation of the JavaFX module javafx.web and take a look at its javafx.scene.web.WebEngine class as it documents its interfaces to JavaScript (note that this implementation mandates that WebEngine objects are created and accessed on the JavaFX Application/GUI thread only).

If exploring that route, maybe the first thing to do is to ask about the viability of such an approach on the javafx mailing list (openjfx-dev mailing list of openjdk.org) first?

---rony


On 26.10.2024 00:45, Packiaraj S wrote:
Thanks Ben.
I used visualVM just to compare CPU consumption between Java-11 & Java 21.
Definitely spending more time using profilers will help to identify the issue but Nashorn's licensing (GPL v2) and inability to create Issue/PR in github repo makes me think if its a right direction towards the resolution of the issue.

On Fri, Oct 25, 2024 at 2:50 PM Ben Evans <[email protected]> wrote:

    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

Reply via email to