2014-06-09 9 views
8

Wir sind gerade dabei, einem unserer Produkte eine serverseitige Skriptfunktionalität hinzuzufügen. Als Teil davon werte ich JSR 223 Script-Engines aus. Da wir möglicherweise eine große Anzahl von Skripts auf dem Server ausführen, mache ich mir besonders Gedanken über die Speichernutzung dieser Skriptmodule. Beim Vergleich von Rhino (Apple JDK 1.6.0_65-b14-462-11M4609, Mac OS X 10.9.2) mit Nashorn (Oracle JDK 1.8.0-b132) scheint es einen dramatischen Unterschied in der Speicherauslastung pro ScriptEngine-Instanz zu geben.Wie viel Speicher verwendet eine Nashorn ScriptEngine?

Um dies zu testen, verwende ich ein einfaches Programm, das 10 leere ScriptEngine-Instanzen startet und dann das Lesen von stdin blockiert. Ich habe dann jmap verwenden, um einen Heap Dump zu nehmen (jmap -dump: format = b, file = heap.bin) und dann für die entsprechende Skript-Engine-Instanz im Dump suchen:

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(); 
    } 
} 

Der Grund für nulling aus dem Verschiedene Reader/Writer-Felder im Kontext sind, weil wir sie nicht verwenden, und frühere Heap-Dumps für Rhino legen nahe, dass sie einen signifikanten Anteil des pro Instanz verursachten Overheads ausmachen (und nicht gemeinsam genutzt werden).

Analyse dieser Heapspeicherauszüge in Eclipse MAT dann habe ich die folgenden pro Instanz beibehalten Speichergrößen erhalten:

  • Rhino: 13.472 Bytes/Instanz (geht bis zu 73.832 Bytes/Instanz, wenn ich null nicht den Leser/Schreibfelder)
  • Nashorn: 324.408 Bytes/Instanz

Ist die 24x Zunahme der Größe für Nashorn zu erwarten? Die Ausführungsgeschwindigkeit ist für die Skripte, die wir ausführen werden, nicht von großer Bedeutung (die meisten werden E/A-gebunden sein), daher erwäge ich, eine eigene Kopie von Rhino für die Verwendung in Java 8+ zu verschicken.

+0

Was haben Sie mit der Verwendung beendet? Könnten Sie den Speicherbedarf für Nashorn bestätigen? – mxro

+0

Wir haben unsere eigene Kopie von Rhino geliefert. –

Antwort