Closed
Bug 243305
Opened 20 years ago
Closed 20 years ago
Memory leak with compiled scripts
Categories
(Rhino Graveyard :: Compiler, defect)
Tracking
(Not tracked)
RESOLVED
INVALID
People
(Reporter: morten, Assigned: igor)
Details
Attachments
(2 files)
We've had problems with JavaScript out in the field where seemingly random javascripts fails with NPE in the constructor. java.lang.ExceptionInInitializerError java.lang.ExceptionInInitializerError: java.lang.NullPointerException at org.mozilla.javascript.gen.c225020.<clinit>(Script 408354) … If anyone has any idea to help us debug this. It only happens in very rare occations (once every 100.000 compile maybe).
Assignee | ||
Comment 1•20 years ago
|
||
Could you try Rhino 1.5R5? Also what is your JVM?
Reporter | ||
Comment 2•20 years ago
|
||
We're only seeing this at a deployed customer site, and I'm not able to repro locally. I'm trying to get them to send me the exact script that is causing it.. The JVM is IBM JDK 1.3.1 running under a weblogic application server. Updating the Rhino engine isn't possible as this happens on a huge production system, and changing engine sometimes changes behavior, so it would take months. But I'll try to get more info about this shortly.
Reporter | ||
Comment 3•20 years ago
|
||
This is the script that normally breaks. Note that it doesn't always fail just sometimes. It does use a lot of functions and I see the function compile is improved for R5, so that might be of help. But if anyone have any idea why there can be a NPE in the class constructor, that would be really great help :)
Assignee | ||
Comment 4•20 years ago
|
||
(In reply to comment #3) > Created an attachment (id=150713) > Failing Javascript > > This is the script that normally breaks. Note that it doesn't always fail just > sometimes. > > It does use a lot of functions and I see the function compile is improved for > R5, so that might be of help. > > But if anyone have any idea why there can be a NPE in the class constructor, > that would be really great help :) Rhino 1.5R5 contains a few fixes for code generation including fixes to race conditions that I think could lead to NPE. Since some fixes were in fact significant chnages to code generation, it would not make sence to backport them since it will only produce just another untested Rhino version. If upgrade is not possible, you may try to work arround them in your Java code that uses Rhino. But that is non-trivial and requires details about your Rhino embedding. >
Reporter | ||
Comment 5•20 years ago
|
||
Well after them investigating more it seems like we found the actual issue. They were doing an eval() inside a for loop creating a -lot- of classes. Now they could in this case rewrite around the eval() it wasn't needed, so I think our issue is gone. Will R5 be more forgiving about eval() and creating classes in general? One of our biggest issues with Rhino/optimization has been that it creates a lot of classes that tends, at least on JDK older than 1.4, to cause the PermMem to fill up rapidly (and never really clean up) causing random crashes and OOM exceptions. This seems to be a jdk issue and not how Rhino does it though (same problems occurs in weblogic with a lot of jsp reloads for example), but I was just wondering if the "new way" of doing things in R5+ might help on that issue. Anyways, I guess there is no fix for this eval() issue, so feel free to close this issue unless anyone got a solution around it ;)
Assignee | ||
Comment 6•20 years ago
|
||
Rhino uses a pure interpretation mode to implement JavaScript eval and no additional classes should be generated for the usage you described. On the other hand if Java code repeatedly recompiles the same script then using R5 may help as it generates one class per script compared with previous releases that produced additional class for each and every function. But if JVM does not really collect generated classes and AFAIK IBM JDK 1.3.1 has this bug, then you better stick with interpretation mode for everything. The bug would also be visible if the code repeatedly initialize Rhino runtime and define additional host objects that extend ScriptableObject for each Context.initStandardObjects call. In this case Rhino also generates additional helper classes to avoid reflection overhead. Even if JVM does not have the bug, I would recommend to use the interpretation mode in a server environment unless you use 1.5R5.
Reporter | ||
Comment 7•20 years ago
|
||
Well in production systems we cache all compiled scripts (very carefully) which is why this is the only customer ever seeing this problem. If we don't cache, servers aren't up more than maybe 30 minutes :). In production these scripts never really changes (and if they do, normally a reboot is done). However, before we started cacheing, I tried at some point to turn off optimization mode (off hand I think it was context.setOptimizationLevel(-1) or something similar), but I swear this still generated classes and therefore didn't help us. I found out why at some point I'll go back and look and see if I find it.
Assignee | ||
Comment 8•20 years ago
|
||
(In reply to comment #7) > However, before we started cacheing, I tried at some point to turn off > optimization mode (off hand I think it was context.setOptimizationLevel(-1) or > something similar), but I swear this still generated classes and therefore > didn't help us. I found out why at some point I'll go back and look and see if I > find it. Do you use JavaAdapter in your scripts to implement/extend Java interfaces and classes? If so then it should also lead to class generation. If not then with context.setOptimizationLevel(-1) turned on Rhino should never generate any classes. You may try to remove org/mozilla/classfile and org/mozilla/javascript/optimizer firectories from your Rhino jar to remove class generation code for sure and see if the memory leak is caused by classes or not.
Assignee | ||
Comment 9•20 years ago
|
||
To check if JVM leaks memory, compile and run the above class like in: javac -classpath js.jar Test.java java -classpath js.jar:. Test Under Sun JDK 1.4.2 for Linux it eventually run out of memory.
Assignee | ||
Comment 10•20 years ago
|
||
Marking as invalid: this is JVM bug with well defined work around which is using interpreted mode.
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → INVALID
Assignee | ||
Updated•20 years ago
|
Summary: NullPointerException in <clinit> of compiled scripts → Memory leak with compiled scripts
You need to log in
before you can comment on or make changes to this bug.
Description
•