Was ist schneller in Java 6 Classloading?

8

Die ProGuard Startseite wird als Feature aufgelistet:

  • Retargeting und Preverifying bestehender Klassendateien für Java 6, zu übernehmen vollständiger Vorteil von Java 6's schnellerem Laden von Klassen.

Was ist der Unterschied in Java 6, auf den es sich bezieht?

Ist es wichtig?

Hat es Auswirkungen auf Verlangsamungen, die durch Multithreading über die synchronisierten Aspekte des Standard-Classloaders verursacht werden?

    
Ed Staub 23.05.2012, 17:27
quelle

3 Antworten

2

Als ProGuard FAQ Hinweise :

  

Der Java 6 Compiler fügt den Klassendateien Vorverifizierungsinformationen hinzu

Mit Blick auf die Java Virtual Machine-Spezifikation Überprüfung nach Typüberprüfung Abschnitt:

  

Wenn eine Java-Virtual-Machine-Implementierung jemals versucht, eine Überprüfung durch Typ-Inferenz auf Klassendateien der Version 50.0 durchzuführen, muss dies in allen Fällen geschehen, in denen die Verifizierung durch Typprüfung fehlschlägt.

     

Dies bedeutet, dass eine Java Virtual Machine-Implementierung nicht wählen kann, in einem Fall auf Typ-Inferenz zurückzugreifen, und nicht in einem anderen Fall. Es muss entweder Klassendateien ablehnen, die nicht über Typchecking überprüft werden, oder aber bei jeder Fehlertypüberprüfung konsistent einen Failover zum Type-Inferencing-Verifier durchführen.

     

Der Typüberprüfer benötigt für jede Methode mit einem Code-Attribut eine Liste von Stack-Map-Frames. Der Typüberprüfer liest die Stack-Map-Frames für jede dieser Methoden und generiert anhand dieser Maps einen Beweis für die Typsicherheit der Anweisungen im Code-Attribut.

Ab Java 6, Klassendateien 50.0 und höher, kann eine JVM während der Klassendateiverifizierung eine Typprüfung oder Typinferenz verwenden. Bevor Sie versuchen, Leistungsvorteile zu verstehen, was ist Typprüfung und Typinferenz? Dieses Dokument, Typ-Überprüfung und Typ-Inferenz für objektorientierte Programmiersprachen sagt:

  

Ein Typsystem ist ein wichtiger Teil einer Programmiersprache. Sprachen, die vollständig auf Laufzeit-Typprüfung basieren, bieten ein hohes Maß an Flexibilität, müssen jedoch normalerweise die Leistung opfern, um dies zu tun.

Und aus Wikipedia auf Inferenz eingeben :

  

Typ-Inferenz ist die Fähigkeit, den Typ eines Ausdrucks zum Zeitpunkt der Kompilierung teilweise oder vollständig automatisch abzuleiten. [...]

     

Um die Informationen zu erhalten, die erforderlich sind, um den Typ eines Ausdrucks abzuleiten, sammelt der Compiler diese Informationen entweder als Aggregat und anschließendes Reduzieren der Typanmerkungen für seine Teilausdrücke oder durch ein implizites Verständnis des Typs verschiedener atomarer Werte. ...].

Die OpenJDK HotSport Runtime-Übersicht erklärt es nett:

  

Gegenwärtig gibt es zwei Methoden zur Analyse der Bytecodes, um die Typen und die Anzahl der Operanden zu bestimmen, die für jede Anweisung vorhanden sind. Die traditionelle Methode wird als "Typinferenz" bezeichnet und arbeitet mit einer abstrakten Interpretation der einzelnen Bytecode- und Merging-Typ-Zustände an Verzweigungszielen oder Ausnahmegriffen. Die Analyse iteriert über den Bytecode, bis ein stationärer Zustand für die Typen gefunden wird. Wenn ein Steady-State nicht gefunden werden kann oder wenn die resultierenden Typen gegen eine Bytecode-Einschränkung verstoßen, wird ein VerifyError ausgelöst. [...]

     

Neu in JDK6 ist die zweite Methode zur Verifizierung, die "Typverifikation" genannt wird. Bei dieser Methode stellt der Java-Compiler Informationen zum stationären Typ für jedes Verzweigungs- oder Ausnahmeziel über das Codeattribut StackMapTable bereit. Die StackMapTable besteht aus einer Reihe von Stack-Map-Frames, die jeweils die Typen der Elemente im Ausdrucksstapel und in den lokalen Variablen bei einem bestimmten Versatz in der Methode angeben. Die JVM muss dann nur einen Durchlauf durch den Bytecode durchführen, um die Korrektheit der Typen zu verifizieren, um den Bytecode zu verifizieren. [...]

Typprüfung bedeutet, dass die JVM die Klassendatei einmal durchlaufen kann, um das Typsystem zu verifizieren; Typinferenz erfordert mehrere Durchgänge. Ist dies eine erhebliche Leistungseinsparung? Es ist wahrscheinlich relativ zu der Gesamtzahl der Klassen, die Sie in Ihrer Anwendung haben und wie viele Klassen-Dateien Sie haben, die weniger als 50.0 (Java 6) und 50.0 und höher sind. Wenn Ihre Anwendung keine performance-kritische Anwendung ist, würde ich mir keine Sorgen machen. Wenn dies der Fall ist, könnten Sie einige Benchmarks ausführen, die Leistungsunterschiede vergleichen, wenn Sie Ihre Anwendung mit Java 5- und Java 6-Klassendateien kompilieren.

    
Dan Cruz 24.05.2012, 13:22
quelle
2

Die Verbesserung laut diesem Java 6 Whitepaper ist:

  

Die Lade- und Erweiterungsklassenlader der Java Virtual Machine wurden bereits verwendet   verbessert, um die Kaltstartzeit von Java-Anwendungen zu verbessern. Vor   Java SE 6, das Öffnen der JAR-Systemdatei verursachte die Java Virtual Machine   eine 1-Megabyte-ZIP-Index-Datei zu lesen, die in viele übersetzt wurde   Disk-Suchaktivität, wenn die Datei nicht im Festplatten-Cache war. Mit   "Class Data Sharing" aktiviert ist, wird die Java Virtual Machine jetzt bereitgestellt   mit einer "Meta-Index" -Datei (in jre / lib), die high-level enthält   Informationen darüber, welche Pakete (oder Paketpräfixe) enthalten sind   in welchen Jar-Dateien.

     

Dies hilft der JVM, das Öffnen aller JAR-Dateien auf dem Boot zu vermeiden   Erweiterungsklassenpfade, wenn eine Java-Anwendungsklasse geladen wird.

Diese spezielle Verbesserung sollte keine Auswirkungen auf laufende Programme haben, da die Klassen aus dem System-Jar bereits geladen sind. Es würde nur die erste Startzeit der Anwendung beeinflussen.

    
Hari Menon 23.05.2012 17:37
quelle
1

(Beantworte meine eigene Frage)

Ich fand die meisten Antworten in diesem Abschnitt " Was ist Vorverifizierung? " auf der ProGuard-Website :

  

Beim Laden von Klassendateien führt der Klassenlader einige anspruchsvolle Funktionen aus   Verifikation des Byte-Codes. Diese Analyse stellt sicher, dass der Code nicht funktioniert   versehentlich oder absichtlich aus der Sandbox des virtuellen herausbrechen   Maschine. [...] Java 6 führte Split-Verification ein.   [...] Der Java 6 Compiler fügt hinzu   Vorverifizierungsinformationen zu den Klassendateien ([...] das Attribut StackMapTable ), um die   Aktueller Verifikationsschritt für den Klassenlader. Klassendateien können dann sein   schneller und auf speicherfreundlichere Weise geladen.

Dies scheint für Nebenläufigkeit nicht relevant zu sein.

Die eine Frage bleibt also: " Ist es wichtig? ", was weitgehend mit "nein" beantwortet wird:

  

Leistung Auswirkung von Java-Klassendateien, die mit "-target 1.5" auf einer 1.6 VM erstellt wurden?

    
Ed Staub 23.05.2012 19:46
quelle

Tags und Links