2014-06-09 7 views
8

Jesteśmy obecnie w trakcie dodawania funkcji obsługi skryptów po stronie serwera do jednego z naszych produktów. W ramach tego oceniam silniki skryptowe JSR 223. Ponieważ potencjalnie możemy uruchamiać dużą liczbę skryptów na serwerze, jestem szczególnie zaniepokojony wykorzystaniem pamięci przez te silniki skryptów. Porównując Rhino (Apple JDK 1.6.0_65-b14-462-11M4609, Mac OS X 10.9.2) z Nashornem (Oracle JDK 1.8.0-b132) wydaje się, że występuje znaczna różnica w wykorzystaniu pamięci przez instancję ScriptEngine.Ile pamięci używa Nashorn ScriptEngine?

Aby to przetestować, używam prostego programu, który uruchamia 10 pustych instancji ScriptEngine, a następnie blokuje czytanie ze standardowego wejścia. Następnie używać jmap podjąć zrzut stosu (jmap -dump: format = b, file = heap.bin), a następnie szukać właściwej instancji silnika skrypt na wysypisko:

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

Powodem Nulling się z różne pola czytników/scenarzystów w kontekście są spowodowane tym, że ich nie używamy, a wcześniejsze zrzuty sterty dla Rhino sugerują, że stanowią znaczną część nakładu na instancję (i nie wydają się być udostępniane).

Analizując te zrzuty sterty w Eclipse MAT następnie pojawia się następujący per-instancji zachował rozmiary sterty:

  • Rhino: 13,472 bajtów/instance (podchodzi do 73,832 bajtów/instancję jeśli nie null czytelnika Pola/writer)
  • Nashorn: 324,408 bajtów/instance

Czy to 24x wzrost wielkości dla Nashorn należy się spodziewać? Szybkość wykonywania nie jest poważnym problemem dla skryptów, które będziemy wykonywać (które będą głównie związane z I/O), więc rozważam wysyłkę naszej własnej kopii Rhino do użycia w Javie 8+.

+0

Po co przestałeś używać? Czy możesz potwierdzić obciążenie pamięci dla Nashorn? – mxro

+0

Wysłaliśmy własną kopię Rhino. –

Odpowiedz