現在、サーバー側のスクリプト機能を製品の 1 つに追加する作業を進めています。その一環として、JSR 223 スクリプト エンジンを評価しています。サーバー上で多数のスクリプトを実行する可能性があるため、これらのスクリプト エンジンのメモリ使用量が特に心配です。Rhino (Apple JDK 1.6.0_65-b14-462-11M4609、Mac OS X 10.9.2) と Nashorn (Oracle JDK 1.8.0-b132) を比較すると、ScriptEngine インスタンスごとのメモリ使用量に劇的な違いがあるようです。
これをテストするために、10 個の空の ScriptEngine インスタンスを起動し、stdin からの読み取りをブロックする単純なプログラムを使用します。次に、jmap を使用してヒープ ダンプを取得し (jmap -dump:format=b,file=heap.bin )、ダンプ内の関連するスクリプト エンジン インスタンスを検索します。
import javax.script.*;
public class test {
public static void main(String...args) throws Exception {
ScriptContext context = new SimpleScriptContext();
context.setWriter(null);
context.setErrorWriter(null);
context.setReader(null);
ScriptEngine js[] = new ScriptEngine[10];
for (int i = 0; i < 10; ++i) {
js[i] = new ScriptEngineManager().getEngineByName("javascript");
js[i].setContext(context);
System.out.println(js[i].getClass().toString());
}
System.in.read();
}
}
コンテキスト内のさまざまなリーダー/ライター フィールドを無効にする理由は、それらを使用しないためです。Rhino の以前のヒープ ダンプは、それらがインスタンスごとのオーバーヘッドのかなりの部分を構成していることを示唆しています (そして、共有されているようには見えません)。 .
これらのヒープ ダンプを Eclipse MAT で分析すると、次のインスタンスごとの保持ヒープ サイズが得られます。
- Rhino: 13,472 バイト/インスタンス (リーダー/ライター フィールドを null にしないと、最大 73,832 バイト/インスタンスになります)
- Nashorn: 324,408 バイト/インスタンス
この 24 倍のサイズの Nashorn の増加は予想されますか? 実行速度は、実行するスクリプト (ほとんどが I/O バウンド) にとって大きな問題ではないため、Java 8+ で使用する独自の Rhino のコピーを出荷することを検討しています。