Вопрос по java, jvm, performance – Что быстрее в загрузке классов Java 6?

8

ProGuard списки домашней страницы как функция:

Retargeting and preverifying existing class files for Java 6, to take full advantage of Java 6's faster class loading.

Какая разница в Java 6, к которой это относится?

Это важно?

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

Это может относиться к этому:java.sun.com/performance/reference/whitepapers/… assylias

Ваш Ответ

3   ответа
2

КакProGuard Часто задаваемые вопросы:

the Java 6 compiler add preverification information to the class files

Глядя наСпецификация виртуальной машины Java Проверка по типу проверки раздел:

If a Java virtual machine implementation ever attempts to perform verification by type inference on version 50.0 class files, it must do so in all cases where verification by typechecking fails.

This means that a Java virtual machine implementation cannot choose to resort to type inference in once case and not in another. It must either reject class files that do not verify via typechecking, or else consistently failover to the type inferencing verifier whenever typechecking fails.

The type checker requires a list of stack map frames for each method with a Code attribute. The type checker reads the stack map frames for each such method and uses these maps to generate a proof of the type safety of the instructions in the Code attribute.

Начиная с Java 6, файлы классов 50.0 и выше, JVM может использовать проверку типа или вывод типа во время проверки файла класса. Прежде чем пытаться понять преимущества производительности, что такое проверка типов и вывод типов? Эта бумага,Проверка типов и вывод типов для языков объектно-ориентированного программирования состояния:

A type system is an important part of a programming language. Languages that rely completely on run-time type-checking provide a high degree of flexibility but must usually sacrifice performance to do so.

И из Википедии наТип вывода:

Type inference is the ability to automatically deduce, either partially or fully, the type of an expression at compile time. [...]

To obtain the information required to infer the type of an expression, the compiler either gathers this information as an aggregate and subsequent reduction of the type annotations given for its subexpressions, or through an implicit understanding of the type of various atomic values [...].

OpenJDK HotSport Runtime Обзор объясняет это красиво:

There are currently two methods of analyzing the bytecodes to determine the types and number of operands that will be present for each instruction. The traditional method is called “type inference”, and operates by performing an abstract interpretation of each bytecode and merging type states at branch targets or exception handles. The analysis iterates over the bytecode until a steady state for the types are found. If a steady state cannot be found, or if the resulting types violate some bytecode constraint, then a VerifyError is thrown. [...]

New in JDK6 is the second method for verification which is called “type verification”. In this method the Java compiler provides the steady-state type information for each branch or exception target, via the code attribute, StackMapTable. The StackMapTable consists of a number of stack map frames, each which indicates the types of the items on the expression stack and in the local variables at some offset in the method. The JVM needs to then only perform one pass through the bytecode to verify the correctness of the types to verify the bytecode. [...]

Проверка типов означает, что JVM может выполнить один проход через файл классов для проверки системы типов; вывод типа требует многократных проходов. Это значительная экономия производительности? Это, вероятно, относится к общему количеству классов, которые у вас есть в вашем приложении, и к количеству файлов классов, которые у вас меньше, чем 50.0 (Java 6) и 50.0 и выше. Если ваше приложение не является критически важным для производительности, я бы не беспокоился об этом; если это так, то вы можете запустить некоторые тесты, сравнивающие различия в производительности при компиляции приложения в файлы классов Java 5 и Java 6.

1

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

Я нашел большую часть ответа в этом & quot;Что такое предварительная проверка?& Quot; раздел на сайте ProGuard:

When loading class files, the class loader performs some sophisticated verification of the byte code. This analysis makes sure the code can't accidentally or intentionally break out of the sandbox of the virtual machine. [...]Java 6 introduced split verification. [...]The Java 6 compiler adds preverification information to the class files ([...] the StackMapTable attribute), in order to simplify the actual verification step for the class loader. Class files can then be loaded faster and in a more memory-efficient way.

Это не имеет отношения к параллелизму.

Итак, один оставшийся вопрос: & quot;Is it significant?& quot ;, на который в основном дан ответ & quot; нет & quot; в:

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

2

Улучшение, согласноэтот документ Java 6 является:

The Java Virtual Machine's boot and extension class loaders have been enhanced to improve the cold-start time of Java applications. Prior to Java SE 6, opening the system jar file caused the Java Virtual Machine to read a one-megabyte ZIP index file that translated into a lot of disk seek activity when the file was not in the disk cache. With "class data sharing" enabled, the Java Virtual Machine is now provided with a "meta-index" file (located in jre/lib) that contains high-level information about which packages (or package prefixes) are contained in which jar files.

This helps the JVM avoid opening all of the jar files on the boot and extension class paths when a Java application class is loaded.

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

Error: User Rate Limit Exceeded Ed Staub
Error: User Rate Limit Exceeded

Похожие вопросы