Как ProGuardFAQ hints:
Java-6 компилятор добавить информацию предварительной проверки в файлы класса
Глядя на Java Virtual Machine SpecificationVerification by Type Checking раздел:
Если реализация виртуальной машины Java когда-либо пытается выполнить проверку с помощью логического вывода типа на версию 50.0 файлов класс, он должен делать это во всех случаях, когда проверка с помощью проверки типов терпит неудачу.
Это означает, что реализация виртуальной машины Java не может прибегать к типу вывода в один раз, а не в другом. Он должен либо отклонять файлы классов, которые не проверяются с помощью typechecking, либо последовательно переходить к верификатору типов, когда проверка типов не выполняется.
Для проверки типа требуется список фреймов карты стека для каждого метода с атрибутом Code. Контроллер типа считывает кадры карты стека для каждого такого метода и использует эти карты для создания доказательства безопасности типов инструкций в атрибуте Code.
Начиная с Java 6, файлы классов 50.0 и выше, JVM может использовать проверку типа или вывод типа во время проверки файла класса. Прежде чем пытаться понять преимущества производительности, что такое проверка типов и тип-вывод? В этой статье, Type-Checking and Type-Inference for Object-Oriented Programming Languages, указывается:
Система типа является важной частью языка программирования. Языки, которые полностью полагаются на проверку типов во время выполнения, обеспечивают высокую степень гибкости, но обычно должны жертвовать производительностью для этого.
А из Википедии на Type inference:
Тип умозаключение является возможность автоматически выводить, либо частично или полностью, тип выражения во время компиляции. [...]
Для получения информации, необходимой для определения типа выражения, компилятор либо собирает эту информацию в виде совокупности, либо последующего сокращения аннотаций типа, заданных для его подвыражений, или посредством неявного понимания тип различных атомных значений [...].
The OpenJDK HotSport Runtime Overview объясняет это красиво:
Есть два метода анализа байткодов, чтобы определить типы и количество операндов, которые будут присутствовать на каждую инструкцию. Традиционный метод называется «вывод типа» и работает, выполняя абстрактную интерпретацию каждого байт-кода и состояний типа слияния в точках филиала или обработчиках исключений. Анализ повторяется по байт-коду, пока не будет найдено устойчивое состояние для типов. Если установившееся состояние не может быть найдено или если результирующие типы нарушают ограничение байтового кода, то вызывается VerifyError. [...]
Новое в JDK6 является вторым методом проверки, который называется «проверка типа». В этом методе компилятор Java предоставляет информацию о состоянии стационарного типа для каждой ветви или цели исключения через атрибут кода StackMapTable. StackMapTable состоит из нескольких фреймов карты стека, каждый из которых указывает типы элементов в стеке выражений и в локальных переменных с некоторым смещением в методе. JVM должен выполнить только один проход через байт-код, чтобы проверить правильность типов для проверки байт-кода. [...]
Проверка типов означает, что JVM может пройти один проход через файл класса, чтобы проверить систему типов; Тип-вывод требует нескольких проходов. Является ли это значительной экономией производительности? Вероятно, это относится к общему количеству классов, которые у вас есть в вашем приложении, и о том, сколько у вас файлов классов меньше 50.0 (Java 6) и 50.0 и выше. Если ваше приложение не является критичным для производительности, я бы не стал беспокоиться об этом; если это так, то вы можете запустить некоторые тесты, сравнивающие различия в производительности при компиляции вашего приложения в файлы классов Java 5 и Java 6.
Это может означать следующее: http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.4.2 – assylias