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


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

просто, чтобы было понятно. Мне не нужен метод больше, чем 64 КБ самостоятельно. Но я написал грамматику, которая компилируется в очень большой метод.

5 72

5 ответов:

по данным JVMS7:

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

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

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

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

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

спасибо,

Он не изменился. Предел кода в методах по-прежнему составляет 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.

Андрей ответил на вопрос java 7 часть этого вопроса уже есть, но, кажется, в то время это было скоро решить о java 8 поэтому я завершаю ответ, чтобы покрыть эту часть:

цитирую виртуальные машины:

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

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

как обходной путь,и если у вас есть доступ к коду парсера, вы можете изменить его для работы в любых пределах, установленных компилятором JVM ... (Предполагая, что это не займет вечность, чтобы найти части в коде парсера для изменения)