максимальный размер класса Java / таблицы исключений - PullRequest
8 голосов
/ 31 марта 2011

Мне было интересно, каков максимальный размер класса Java. Как показано здесь http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546 в структуре атрибутов кода, длина кода указывается в 4 байтах, поэтому это большое число. Что я не понял, так это то, что атрибуты pc таблицы исключений составляют 2 байта. Как это может работать, если длина кода превышает 2 байта, но таблицы исключений могут адресовать только 2 байта?

Ответы [ 3 ]

11 голосов
/ 31 марта 2011

§ 4.8.1 Статические ограничения спецификации JVM гласит:

Значение элемента code_length должно быть меньше 65536.

Таким образом, хотя это 4-байтовое значение, оно не должно превышать 64 КБ.

4 голосов
/ 06 сентября 2011

Итак, я наткнулся на это и мне стало скучно, поэтому я решил попробовать. (Запуск Java 1.6.0_26 на четырехъядерном MacPro 1,1)

Оказывается, Eclipse, по крайней мере, признал предел, заявив, что в методе не может быть более 65 535 байт. Однако по какой-то причине это относится только к методу main и к методам конструктора, а НЕ к обычным методам класса. Когда основные методы и методы конструктора были меньше 65 КБ, код запускался без проблем. У Eclipse были некоторые проблемы с такими большими методами (100% ЦП в течение нескольких секунд, и призрачные иконки ошибок останутся в редакторе), но на самом деле код работал нормально.

Я добавил 5 дополнительных методов, каждый из которых имел по крайней мере 100 КБ кода (в основном это gibberish System.out.println ("бла"), и сами методы использовали несколько параметров и вернули значение. Таким образом, они были настолько "нормальными", насколько я мог сделать их. Я пробовал запускать их несколько раз, и они всегда работали идеально.

Итак, кажется, что существует ограничение в 65 КБ, но оно определенно не относится к абсолютному размеру класса, и, по-видимому, оно применимо только к «специальным» методам, таким как методы main или constructor.

Однако, по крайней мере, в моем случае, большая проблема заключалась в том, что Eclipse просто не мог обрабатывать файлы такого типа. Процессор начинает работать на 100%, и вся среда IDE иногда зависает. Большую часть времени казалось, что Eclipse просто пересчитывает подсветку синтаксиса (!). По крайней мере, в то время остальная часть системы реагировала, что, скорее всего, говорит об OS X больше, чем о Java.

Конечно, почему бы вам вообще не приблизиться к этим пределам, мне не под силу. Разум и здравый смысл, если не принципы ОО, должны были позаботиться об этом задолго до того, как он приблизился к 65К. Но это был хороший эксперимент, и я кое-чему научился!

Просто для справки, вот что я тестировал:

~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)
4 голосов
/ 31 марта 2011

Таблица исключений индексирует код определенного метода, чей код не может быть длиннее 64 КБ.Но так как в классе может быть много методов, это не накладывает ограничений на размер класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...