openjdk.ruOpenJDK на русском

JEP 194: Nashorn Code Persistence

Сохранение кода в Nashorn

ОтветственныйJim Laskey
ТипFeature
ОбластьImplementation
СтатусClosed / Withdrawn
Компонентcore-libs
Обсуждениеnashorn dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
Создан2013/12/13 20:00
Обновлён2015/01/06 20:02
Задача8046184

Аннотация

Доработать Nashorn, чтобы он кэшировал и повторно использовал байт-код, созданный для многократно встречающихся фрагментов JavaScript.

Цели

Кэшировать код, чтобы его можно было повторно использовать в том же процессе. Это приведёт к снижению потребления памяти и времени запуска.

Что не является целью

Попыток сделать кэш общим для нескольких процессов предприниматься не будет.

Критерии успеха

Объём памяти под код должен сократиться с одной единицы на каждый вызов до одной единицы на процесс.

Мотивация

Nashorn используется в ряде серверных приложений. Есть опасение, что отсутствие повторного использования кода может влиять на время запуска и потребление памяти.

Описание

Существующая модель

Существующая модель Nashorn просто компилирует код по требованию. Каждый поток получает отдельный компилятор для каждой компиляции. Потоки и контексты никак не взаимодействуют друг с другом. Байт-код пытаются кэшировать по URL исходного кода, но этого недостаточно.

NashornCodeManager

В предлагаемой модели инициализация NashornScriptEngine будет включать запуск NashornCodeManager (интерфейс). Этот NashornCodeManager будет отвечать за получение всего кода, который использует экземпляр NashornScriptEngine. В общем случае NashornCodeManager будет принимать из (конкурентной) очереди NashornCodeRequest с Source Nashorn и сопоставлять Source с кодом. Каждый NashornCodeManager отвечает за постановку этих запросов в очередь и выдачу ответов, когда код становится доступен. Код становится доступен в результате поиска уже существующего кода или компиляции исходного кода из запроса.

Предполагается, что в зависимости от приложения будут использоваться разные версии NashornCodeManager;

  • NashornSimpleCodeManager (класс) повторяет то, как код управляется в существующей версии Nashorn, работающей отдельно в каждом потоке. Это понадобится для версий JVM без поддержки потоков (встраиваемых).

  • NashornSharedCodeManager (подкласс NashornSimpleCodeManager) работает в отдельном потоке и используется совместно всеми потоками текущего процесса. Для большинства приложений это будет вариант по умолчанию.

NashornCodeCache

У каждого NashornCodeManager также будет NashornCodeCache (интерфейс), в котором выполняется поиск перед попыткой скомпилировать исходный код. Критерии эквивалентности при поиске определяет реализация NashornCodeCache.

  • NashornNullCodeCache (класс) всегда возвращает неудачу, поэтому его можно использовать, когда кэширование выполнять не нужно.

  • NashornSharedCodeCache (подкласс NashornNullCodeCache) — это отображение в памяти из Source в код. Для большинства приложений это вариант по умолчанию.

Типы критериев эквивалентности могут включать:

  • URL исходного кода или URL + базу контекста;

  • сам исходный код (в случае eval), и тогда проверке помогло бы использование хэш-кодов;

  • диапазон символов в исходном коде (ленивая компиляция); и

  • сигнатуру функции (оптимистичная типизация).

NashornCodeRequest

Среда выполнения Nashorn будет создавать NashornCodeRequest (класс) со всей информацией, необходимой для поиска кода и, при необходимости, для его компиляции. Эта информация будет включать Source (URL и текст исходного кода), контекст выполнения и контекст компиляции.

NashornCodeResponse

NashornCodeManager будет создавать NashornCodeResponse (класс) со всей информацией, необходимой для выполнения кода (класс и метод). NashornCodeResponse может содержать признак ошибки, указывающий, что компиляция не удалась или код недоступен.