Максимальный размер метод в Java 7 и 8

Я знаю, что метод не может быть больше 64&ампер;усилитель; nbsp;КБ с Java. Ограничение вызывает у нас проблемы с сгенерированный код из JavaCC грамматикой. У нас были проблемы с Java 6 и были в состоянии исправить это путем изменения грамматики. Имеет ограничение на Java 7 или планируется для Java 8?

Просто чтобы было понятно. Я не'т нужна способ больше, чем 64&ампер;усилитель; nbsp;КБ сам. Но я написал грамматику, которая компилируется в очень большой способ.

Комментарии к вопросу (4)
Решение

По данным JVMS7 :

тот факт, что end_pc является эксклюзивным является исторической ошибкой в дизайн виртуальной машины Java: если код виртуальной машины Java для метода точно 65535 байт и заканчивается с инструкцией это 1 байт, то что команда не может быть защищен обработчик исключений. Писатель компилятора можно обойти этот баг предельный максимальный размер создаваемой виртуальной машины Java код для любого метода, метода инициализации экземпляра или статический инициализатор (размер любого массива код) до 65534 байта.

Но это о Ява 7. <удар>нет окончательной спецификации для Java 8, так что никто (кроме разработчиков) мог ответить на этот вопрос.</удара>

УПД (2015-04-06) по данным JVM8 это также верно для Ява 8.

Комментарии (2)

Хороший вопрос. Как всегда, мы должны пойти в источник, чтобы найти ответ (с"Ява® спецификации виртуальной машины на"). В разделе не упоминаются ограничения (как это делали Java6 ВМ спецификаций), хотя, но несколько осмотрительно:

наибольшее количество локальных переменных в локальные переменные, такие каркас создается при вызове метода (§2.6) ограничивается 65535 размер max_locals пункт Код атрибута (§4.7.3) предоставление кода метода, а с помощью 16-разрядной локальной переменной индексации в набор команд виртуальной машины Java.

Ура,

Комментарии (1)

Она не изменилась. Ограничение кода в методах-это по-прежнему 64 КБ в Java 7 и Java 8.

Ссылки:

  1. Из Java 7 спецификация виртуальной машины (4.9.1 статические ограничения):

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

статические ограничения на инструкции в массиве код следующим образом:

  • массив код не должен быть пустым, так code_length элемент не может иметь значение 0.
  • значение элемента code_length должно быть меньше, чем 65536.
  1. Из Java 8 спецификация виртуальной машины (4.7.3 код атрибута):

значение code_length элемент содержит количество байтов в массиве код для этого способ.

значение code_length должно быть больше нуля (как массив, код должен не быть пустым) и меньше чем 65536.

Комментарии (0)

Andremoniy ответил на Ява 7 частично на этот вопрос уже, но кажется в то время было только решить, о Ява 8, так что я полный ответ, чтобы покрыть эту часть:

Цитата из управляют:

тот факт, что end_pc является эксклюзивным является исторической ошибкой при проектировании виртуальной машины Java: если виртуальная машина Java код для метода точно 65535 байт и заканчивается с инструкцией, что составляет 1 байт, то, что инструкция не может быть защищено обработчик исключений. Писатель, компилятор может устранить эту ошибку, ограничив максимальный размер генерируемого кода виртуальной машины Java для любого метода, метода инициализации экземпляра или статический инициализатор (размер любого массива код) до 65534 байта.

Как вы видите, кажется, что эта историческая проблема не'т, кажется, чтобы исправить по крайней мере в этой версии (в Java 8).

Комментарии (0)

В качестве обходного пути, и if у вас есть доступ к анализатору's код, вы могли бы изменить его, чтобы работать в течение, что 'ограничения, налагаемые компилятор для JVM ... (Если это Ден'т длиться вечно, чтобы найти участки в коде парсера изменить)

Комментарии (0)