2012-05-23 2 views
8

В ProGuard списках главной страницы как особенность:Что быстрее в загрузке классов Java 6?

  • Ретаргетинга и preverifying существующих файлов классы для Java 6, чтобы принять полное преимущество более быстрой загрузки классов Java 6 в.

В чем разница в Java 6, на что это относится?

Значительная?

Это влияет на замедление, вызванное многопотоком через синхронизированные аспекты загрузчика классов по умолчанию?

+1

Это может означать следующее: http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.4.2 – assylias

ответ

2

Как 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.

2

Улучшение, по this Java 6 white paper является:

Виртуальная машина Java в загрузочные и класса расширения погрузчиков были повышенной, чтобы улучшить время холодного старта в Java-приложений. До Java SE 6, открывающий файл системной jar, заставил виртуальную машину Java прочитать индексный файл индекса в 1 мегабайт, который был переведен во множество операций поиска диска, когда файл не был в кеше диска. С включенным « « обмен данными между классами »виртуальная машина Java теперь предоставляется с файлом« meta-index »(расположенным в jre/lib), который содержит высокоуровневую информацию , в которой содержатся пакеты (или префиксы пакетов) в котором хранятся файлы jar.

Это помогает JVM избежать открытия всех файлов jar на загрузке и пути класса расширения при загрузке класса Java-приложения.

Это особое улучшение не должно оказывать никакого влияния на запуск программ, поскольку классы из системной банки уже будут загружены. Это повлияло бы только на первое время запуска приложения.

+0

ProGuard изменяет классы приложений, которые AFAICT ничего не получат от этой JVM-загрузки повышение производительности. Поэтому, если это то, о чем они говорят, это кажется фиктивным. Кажется, что «должна» быть некоторой оптимизацией загрузчика классов, относящейся к классам приложений, которые могут применяться только к файлам классов, которые скомпилированы для 6 или которые были обработаны ProGuard. –

+0

@Raze, это не имеет ничего общего с оптимизацией, о которой спрашивает вопрос. – Antimony

1

(отвечая на мой собственный вопрос)

я нашел большую часть ответа в данном разделе «What is preverification?» на сайте ProGuard:

Когда файлы загрузки класса, класс погрузчик выполняет некоторые сложные проверка байтового кода. Этот анализ гарантирует, что код не может случайно или намеренно вырваться из песочницы виртуальной машины . [...] В Java 6 была введена разделенная проверка. [...] Компилятор Java 6 добавляет информацию о предыстории в файлы классов ([...] атрибут StackMapTable), чтобы упростить действительный этап проверки для загрузчика классов. Затем файлы классов могут быть загружены быстрее и более экономичным способом.

Это не похоже на параллелизм.

Таким образом, остается вопрос: «Значительно ли это?», который в основном ответили "нет":

Performance impact of Java class files generated with "-target 1.5" running on a 1.6 VM?