Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Nashorn в нескольких ClassLoader'ах / 5 сообщений из 5, страница 1 из 1
21.08.2014, 14:20
    #38725609
Foror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nashorn в нескольких ClassLoader'ах
Сейчас думаю как лучше выполнять JS программы - предварительно создавать JVM с подготовленными инстансами
классов или сделать одну JVM и поднимать новый ClassLoader для каждой JS программы. Последнее получается
лучше в плане потребления памяти. Т.к. одна JVM занимает 50 Мб, а 3 уже займут 150 Мб и будут висеть мертвым грузом.

Но с ClassLoader'ами возникла заминка, всё описано в комментарии к main методу:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package prjctor;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.script.Bindings;
import javax.script.ScriptException;

import jdk.nashorn.api.scripting.NashornScriptEngine;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

public class ClassloaderContainerExperiment {

	/**
	 * Если в конце не делать l.clear(), то первый код выполнится быстро, а вот второй код, если
	 * задать -Xmx64m зависнет, т.к. видимо где-то лежит ссылка на коллекцию l и она не удаляется
	 * GC.
	 * 
	 * Таким образом нет смысла делать один общий контейнер, т.к. скрипты будут постепенно 
	 * его засорят и в итоге он будет виснуть с вылетами.
	 */
	public static void main(String[] args) throws InterruptedException, ScriptException, InstantiationException, IllegalAccessException, ClassNotFoundException, IOException {
		long start = System.currentTimeMillis();
		URLClassLoader loader1 = new URLClassLoader(new URL[]{});
		NashornScriptEngine js = (NashornScriptEngine)((NashornScriptEngineFactory)loader1.loadClass("jdk.nashorn.api.scripting.NashornScriptEngineFactory").newInstance()).getScriptEngine(new String[] {"--persistent-code-cache", "-Dnashorn.persistent.code.cache=/home/foror/jscache"});
		Bindings b1 = js.createBindings();
		b1.put("js1", js);
		js.eval("var i = 1000000; var l = new java.util.ArrayList(); while (i-- > 0) { l.add(java.util.UUID.randomUUID()) }; l.clear();", b1);
		System.out.println("started " + (System.currentTimeMillis() - start));
		loader1.close();
		
		start = System.currentTimeMillis();
		URLClassLoader loader2 = new URLClassLoader(new URL[]{});
		NashornScriptEngine js2 = (NashornScriptEngine)((NashornScriptEngineFactory)loader2.loadClass("jdk.nashorn.api.scripting.NashornScriptEngineFactory").newInstance()).getScriptEngine(new String[] {"--persistent-code-cache", "-Dnashorn.persistent.code.cache=/home/foror/jscache2"});
		Bindings b2 = js2.createBindings();
		b2.put("js2", js2);
		js2.compile("var i = 1000000; var l = new java.util.ArrayList(); while (i-- > 0) { l.add(java.util.UUID.randomUUID()) }; l.clear();").eval(b2);
		System.out.println("started " + (System.currentTimeMillis() - start));
		loader2.close();
		
		start = System.currentTimeMillis();
		URLClassLoader loader3 = new URLClassLoader(new URL[]{});
		NashornScriptEngine js3 = (NashornScriptEngine)((NashornScriptEngineFactory)loader3.loadClass("jdk.nashorn.api.scripting.NashornScriptEngineFactory").newInstance()).getScriptEngine(new String[] {"--persistent-code-cache", "-Dnashorn.persistent.code.cache=/home/foror/jscache3"});
		Bindings b3 = js3.createBindings();
		b3.put("js3", js3);
		js3.eval("var i = 1000000; var l = new java.util.ArrayList(); while (i-- > 0) { l.add(java.util.UUID.randomUUID()) }; l.clear();", b3);
		System.out.println("started " + (System.currentTimeMillis() - start));
		loader3.close();
		System.gc();

		Thread.sleep(1000000);
	}
...
Рейтинг: 0 / 0
21.08.2014, 14:22
    #38725613
Foror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nashorn в нескольких ClassLoader'ах
А вопрос и забыл, это такая бага или фича, стоит с этим идти в nashron dev mailing list?
...
Рейтинг: 0 / 0
21.08.2014, 14:29
    #38725626
Foror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nashorn в нескольких ClassLoader'ах
Может я чего напутал и неправильно сделал?
...
Рейтинг: 0 / 0
21.08.2014, 21:01
    #38726069
Foror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nashorn в нескольких ClassLoader'ах
Уфф, проветрил мозги на велике и сразу пришло решение )

Код: java
1.
2.
3.
loader1 = null;
b1 = null;
js = null;
...
Рейтинг: 0 / 0
22.08.2014, 00:44
    #38726158
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Nashorn в нескольких ClassLoader'ах
Foror, твой код ужасен. Почитай книжки по рефакторингу.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Nashorn в нескольких ClassLoader'ах / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]