Ошибка Nashorn JDK8u40 "Слишком большой код метода"

Eval Nashorn js-скрипта для метода, вызываемого для объекта, который фактически реализуется его суперклассом, делегирует динамический компоновщик. Это перебирает всю иерархию класса и создает classWriter на всех его методах. Если суперклассы содержат несколько тысяч методов, они все равно выдают ошибку "Code Code Too Large", превышающую ограничение в 64 КБ, определенное JDK.

var obj = SomeInitCode.getObjectOfCustomType ();

var xyz = obj.doSomeOperation () // это метод, реализованный в суперклассе obj, который является Abstract.

Затем механизм Nashorn пытается создать адаптер, который после этого выходит из строя, поскольку в моем случае существует более 6000 методов для класса Abstract и его суперклассов.

Ref:

http://skrishnamachari.wordpress.com/2014/06/18/nashorn-bug/

Также есть возможность доступа к последнему источнику Nashorn, чтобы иметь возможность быстро отлаживать. По крайней мере, найдите взломать / подтвердить и оставьте его для нашего использования, пока не будет предоставлен какой-то финальный патч

1 ответ

Конечно, последнее репозиторий для разработчиков для ветки 8u доступно по адресу http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn. Скоро он станет этапом разработки для 8u60, но тогда вы сможете получить код 8u40 здесь: http://hg.openjdk.java.net/jdk8u/jdk8u40-dev/nashorn. Код FWIW, 8u и 9 для Nashorn пока почти полностью идентичен (до сих пор мы перенесли все с 9 на 8u, за исключением некоторых изменений парсера, которые фактически не влияют на внешне наблюдаемое поведение).

Говоря о вашей проблеме: если нам нужно сгенерировать класс адаптера JS-Java для класса Java с +6000 методов, то он действительно потерпит неудачу, так как конструктор класса будет иметь код для поиска 6000 JS-функций в адаптированный объект, и это действительно будет слишком большим. Возможно, мы могли бы придумать какой-то другой способ организации конструктора, но это, кажется, очень большая работа для, мы надеемся, редкого случая, когда у людей есть огромные классы.

В качестве альтернативы, мы могли бы проверить, будем ли мы создавать адаптеры только тогда, когда они действительно необходимы. Приведенный выше фрагмент кода выглядит так, как будто адаптер не является строго необходимым в этот момент, поэтому может случиться так, что в определенных сценариях мы с нетерпением ждем создания классов адаптеров. Возможно, у вас есть полная трассировка стека?

Другие вопросы по тегам