Почему Java 6 скомпилирован, размер класса больше, чем Java 5?

Мы замечаем, что когда мы скомпилируем наши классы на Java 6, они последовательно больше, чем Java 5.

Я понимаю, что до сих пор не было изменений в байтовом коде, поэтому я предполагаю, что компилятор Java 6 бросает больше материала. Это все требуется, или есть способ отключить это и все еще скомпилировать исходный код Java 6?

Ответ 1

В версии 6 javac генерируются дополнительные атрибуты "Stack Map" в файлах классов, чтобы упростить и ускорить проверку jvm. Я сомневаюсь, что это слишком большая разница в размерах, вы всегда можете использовать параметр -target 1.5, чтобы он сгенерировал тот же байт-код, что и раньше в версиях.

Изменить: Сведения об этом новом атрибуте можно найти в разделе 4.8.4 jsr 202

4.8.4 Атрибут StackMapTable

Атрибут карты стека является атрибутом переменной длины в таблице атрибутов кода атрибут. Имя атрибута - StackMapTable. Этот атрибут используется во время процесс проверки путем проверки типов (§4.11.1).

Атрибут карты стека состоит из нулевого или большего количества кадров карты кадров. Каждая карта стека frame указывает (явно или неявно) смещение байт-кода, проверку типы (§4.11.1) для локальных переменных и типы верификации для операнда стек.

Ответ 2

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