Nashorn increase in eval duration over time

Hannes Wallnoefer hannes.wallnoefer at oracle.com
Wed Mar 16 10:43:48 UTC 2016


Jan,

This definitely looks like a bug in the implementation of method 
handles. I've filed a bug:

https://bugs.openjdk.java.net/browse/JDK-8151981

If there is any information you can add please do so, it will make 
finding and fixing the problem easier.

Hannes

Am 2016-03-14 um 18:16 schrieb Jan Bauer Nielsen:
> Hi Hannes.
>
> Yes, the second batch gets a new set of script engines.
>
> The java version is 1.8.0_72-b15, so it should be pretty recent. We 
> haven't tried any of the java 9 ea builds, since our production 
> version of GlassFish won't run with this.
>
> Jan
>
> On 2016-03-14 17:44, Hannes Wallnoefer wrote:
>> Hi Jan,
>>
>> This list is fine for reporting Nashorn related problems.
>>
>> Is it correct that the second batch of business logic is evaluated 
>> into a completely new set of script engines? In that case I'm not 
>> sure how the problem could be with Nashorn, since different script 
>> engines should not share anything. So that could hint at a problem 
>> deeper down in the implementation of method handles.
>>
>> If you are using JDK 8_25 (not sure I parse the version string 
>> correctly) one thing you could try is to use a newer JDK 8 update 
>> release. There are a few issues that have been fixed in later releases.
>>
>> Hannes
>>
>> Am 2016-03-10 um 13:13 schrieb Jan Bauer Nielsen:
>>> First of all I'm sorry if this is not the right forum for this type 
>>> of question, but I haven't been able to find a nashorn-user mailing 
>>> list or anything like that.
>>>
>>> We have an enterprise application (using GlassFish 4.1 as 
>>> application server) which sits in the middle of a processing 
>>> pipeline receiving data messages from a JMS queue and applying 
>>> business logic in the form of substantial (30.000+ lines) 
>>> javascripts to said data. The business logic is user defined, varies 
>>> on the type of input format, and as such is not known to us at 
>>> application startup. The setup in question allows for 8 concurrent 
>>> processor threads, where each thread evals into (and caches) one 
>>> script engine per unique set of business logic (the cache is 
>>> actually on the EJB level and not on the thread level).
>>>
>>> Submitting a batch requiring business-logic-x results in below eval 
>>> times:
>>>
>>> [2016-03-10 09:15:41,756] [INFO] [p: thread-pool-1; w: 43] Module 
>>> eval took 6540 ms
>>> [2016-03-10 09:15:42,918] [INFO] [p: thread-pool-1; w: 39] Module 
>>> eval took 7663 ms
>>> [2016-03-10 09:15:44,188] [INFO] [p: thread-pool-1; w: 46] Module 
>>> eval took 9000 ms
>>> [2016-03-10 09:15:44,670] [INFO] [p: thread-pool-1; w: 42] Module 
>>> eval took 9481 ms
>>> [2016-03-10 09:15:44,920] [INFO] [p: thread-pool-1; w: 41] Module 
>>> eval took 9681 ms
>>> [2016-03-10 09:15:45,043] [INFO] [p: thread-pool-1; w: 40] Module 
>>> eval took 9784 ms
>>> [2016-03-10 09:15:45,196] [INFO] [p: thread-pool-1; w: 44] Module 
>>> eval took 9944 ms
>>> [2016-03-10 09:15:45,427] [INFO] [p: thread-pool-1; w: 45] Module 
>>> eval took 10222 ms
>>>
>>> Subsequently submitting another batch requiring business-logic-y 
>>> forcing more script engines to be created (simulated here by 
>>> clearing cached script engines from application and resubmitting 
>>> batch for business-logic-x) results in much worse performance:
>>>
>>> [2016-03-10 09:26:07,129] [INFO] [p: thread-pool-1; w: 31] Module 
>>> eval took 226070 ms
>>> [2016-03-10 09:26:14,760] [INFO] [p: thread-pool-1; w: 40] Module 
>>> eval took 234753 ms
>>> [2016-03-10 09:26:17,167] [INFO] [p: thread-pool-1; w: 26] Module 
>>> eval took 230762 ms
>>> [2016-03-10 09:26:22,174] [INFO] [p: thread-pool-1; w: 36] Module 
>>> eval took 235614 ms
>>> [2016-03-10 09:26:22,978] [INFO] [p: thread-pool-1; w: 30] Module 
>>> eval took 238836 ms
>>> [2016-03-10 09:26:28,909] [INFO] [p: thread-pool-1; w: 38] Module 
>>> eval took 242011 ms
>>> [2016-03-10 09:26:40,921] [INFO] [p: thread-pool-1; w: 32] Module 
>>> eval took 252076 ms
>>> [2016-03-10 09:26:50,700] [INFO] [p: thread-pool-1; w: 35] Module 
>>> eval took 262625 ms
>>>
>>> We are not seeing anything out of the ordinary with regard to GC, 
>>> apart from survivor space often being near 100% full before objects 
>>> are moved to old-gen. Heap and code cache are nowhere near to being 
>>> exhausted.
>>>
>>> Unfortunately we haven't been able to get java flight recorder to 
>>> work with this GlassFish installation, but jvisualvm samples 
>>> indicates that 80% of our time is being spent in 
>>> java.lang.invoke.MethodHandleNatives.setCallSiteTargetNormal().
>>>
>>> We have tried running both single threaded and with a shared script 
>>> engine creating separate script contexts, and although we are seeing 
>>> much better performance in these cases, we are still seeing an 
>>> increase in eval times nonetheless (in the shared engine case, the 
>>> eval times of the second batch is a factor 10 less than the numbers 
>>> above, but it is still a factor 5 larger than the initial batch).
>>>
>>> We are running on java build 25.72-b15.
>>>
>>> Any input as to what we might be doing wrong and possibly how to 
>>> avoid it would be very much appreciated.
>>>
>>> This problem has actually forced us to remain on the Rhino script 
>>> engine for the time being.
>>>
>>> Kind regards,
>>>
>>> Jan Bauer Nielsen
>>> Software developer
>>> DBC as
>>> http://www.dbc.dk/english
>>
>



More information about the nashorn-dev mailing list