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+.
Po co przestałeś używać? Czy możesz potwierdzić obciążenie pamięci dla Nashorn? – mxro
Wysłaliśmy własną kopię Rhino. –