Почему размер скомпилированного класса Java 6 больше, чем у Java 5? - PullRequest
10 голосов
/ 12 апреля 2011

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

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

Ответы [ 2 ]

14 голосов
/ 12 апреля 2011

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

Редактировать: Подробности об этом новом атрибуте могутможно найти в разделе 4.8.4 из jsr 202

4.8.4 Атрибут StackMapTable

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

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

2 голосов
/ 12 апреля 2011

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

...