powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Nashorn в нескольких ClassLoader'ах
5 сообщений из 5, страница 1 из 1
Nashorn в нескольких ClassLoader'ах
    #38725609
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас думаю как лучше выполнять 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
Nashorn в нескольких ClassLoader'ах
    #38725613
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вопрос и забыл, это такая бага или фича, стоит с этим идти в nashron dev mailing list?
...
Рейтинг: 0 / 0
Nashorn в нескольких ClassLoader'ах
    #38725626
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я чего напутал и неправильно сделал?
...
Рейтинг: 0 / 0
Nashorn в нескольких ClassLoader'ах
    #38726069
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уфф, проветрил мозги на велике и сразу пришло решение )

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


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