it-swarm.com.ru

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

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

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

75
LaurentG

Согласно JVMS7 :

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

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

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

55
Andremoniy

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

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

Ура,

10
Anders R. Bystrup

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

7
Philipp Claßen

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

Цитирование из jvms :

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

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

1
mok