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

<p>я знаю, что метод не может быть больше, чем 64 кб с java. ограничение вызывает у нас проблемы с сгенерированным кодом из грамматики <a href="http://en.wikipedia.org/wiki/javacc">javacc</a> . у нас были проблемы с java 6, и мы смогли это исправить, изменив грамматику. был ли изменен лимит для java 7 или он запланирован для java 8?</p><p>просто чтобы было понятно. мне не нужен метод больше, чем 64 кб. но я написал грамматику, которая компилируется в очень большой метод.</p>

<p>согласно <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.3">jvms7</a> :</p><blockquote> <p>тот факт, что end\_pc является эксклюзивным, является исторической ошибкой при проектировании виртуальной машины java: если код виртуальной машины java для метода имеет длину ровно 65535 байт и заканчивается инструкцией если длина составляет 1 байт, то эта инструкция не может быть защищена обработчиком исключений. разработчик компилятора может обойти эту ошибку, ограничив максимальный размер сгенерированного кода виртуальной машины java для любого метода, метода инициализации экземпляра или статического инициализатора (размер любого массива кода) 65534 байтами.</p> </blockquote><p>но это примерно <code>java 7</code>. <strike>окончательных спецификаций для java 8 не существует, поэтому никто (кроме его разработчиков) не мог ответить на этот вопрос.</strike></p><p><strong> upd (2015-04-06) </strong> согласно <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7">jvm8</a> это также верно для <code>java 8</code>.</p>

<p>хороший вопрос. как всегда, мы должны перейти к <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.11">источник</a> , чтобы найти ответ ( <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/index.html">"спецификация виртуальной машины java"</a> ). в этом разделе явно не упоминается ограничение (как это было в спецификации java6 vm), но несколько осмотрительно:</p><blockquote> <p>наибольшее количество локальных переменных в массиве локальных переменных кадра, созданного при вызове метода (§2.6), ограничено 65535 размером элемента max\_locals атрибута code (§4.7.3), дающего код и 16-разрядной индексацией локальной переменной набора команд виртуальной машины java.</p> </blockquote><p>ура,</p>

<p>это не изменилось. ограничение кода в методах по-прежнему составляет 64 кб в java 7 и java 8.</p><p><strong> ссылки: </strong></p><ol> <li>из спецификации виртуальной машины java 7 ( <a href="http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1">4.9.1 статические ограничения</a> ):</li> </ol><blockquote> <p>статические ограничения на код виртуальной машины java в файле класса указывают, как java инструкции виртуальной машины должны быть размещены в массиве кода и какими должны быть операнды отдельных инструкций.</p> <p>статические ограничения на инструкции в массиве кода следующие:</p> <ul> <li>массив кода не должен быть пустым, поэтому элемент code\_length не может иметь значение 0.</li> <li>значение элемента code\_length должно быть меньше 65536.</li> </ul> </blockquote><ol start="2"> <li>из спецификации виртуальной машины java 8 ( <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3">4.7.3 атрибут кода</a> ):</li> </ol><blockquote> <p>значение элемента code\_length дает количество байтов в массиве кода для этого метода.</p> <p>значение code\_length должно быть больше нуля (так как массив кода не должен быть пустым) и меньше 65536.</p> </blockquote>

<p>andremoniy уже ответил на часть <code>java 7</code> на этот вопрос, но, кажется, в то время уже было принято решение о <code>java 8</code>, поэтому я завершаю ответ, чтобы охватить эту часть:</p><p>цитирование из <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3">jvms</a> :</p><blockquote> <p>тот факт, что end\_pc является эксклюзивным, является исторической ошибкой при проектировании виртуальной машины java: если код виртуальной машины java для метода имеет длину ровно 65535 байт и заканчивается инструкцией если длина составляет 1 байт, то эта инструкция не может быть защищена обработчиком исключений. автор компилятора может обойти эту ошибку, ограничив максимальный размер сгенерированного кода виртуальной машины java для любого метода, метода инициализации экземпляра или статического инициализатора (размер любого массива кода) 65534 байтами.</p> </blockquote><p>как видите, эта историческая проблема, по-видимому, не устраняется, по крайней мере, в этой версии (java 8).</p>