Wie funktioniert die Optimierung der letzten Referenzen in Java?

8

Ich habe versucht, alles über Java-Optimierungen herauszufinden und etwas Interessantes gefunden.

Erster Fall: primitive Art der Kompilierzeitoptimierung

%Vor%

Nach der Kompilierung (ich verwende jd-gui-0.3.5.windows um Binärdateien zu dekompilieren) sieht es so aus:

%Vor%

Wie erwartet, nicht wahr? i wurde nach dem Kompilieren durch seinen Wert ersetzt (Inlining-Optimierung). Also habe ich erwartet, etwas Ähnliches zu sehen, nachdem primitiver Typ durch seinen Wrapper ersetzt wurde, aber ...

Zweiter Fall: Nicht-primitive Art der Kompilierzeitoptimierung

%Vor%

Nach der Kompilierung:

%Vor%

Fragen:

Was ist Clazz.this in diesem Zusammenhang? Ich weiß, dass es sich um eine umschließende Instanz von Clazz handelt, aber in diesem Fall sollte es nicht funktionieren! Ich muss i drucken, aber der Compiler schlägt mir vor, Clazz.this zu drucken, und es funktioniert! Was ist das Problem? Wird jd-gui falsch dekompiliert oder fehlt etwas bei der Java-Kompilierung und -Optimierung?

UPD:

Inhalt von Class :

%Vor%     
bsiamionau 25.03.2013, 11:13
quelle

3 Antworten

8
  

Wird jd-gui falsch dekompiliert oder fehlt etwas bei der Java-Kompilierung und -Optimierung?

jd-gui dekompiliert den Code falsch.

Auf meiner JVM sieht der disassemblierte Code für die anonyme Klasse wie folgt aus:

%Vor%

Wie Sie sehen, ist eine Kopie von i in der anonymen Klasse im Feld val$i gespeichert (der Name ist implementierungsspezifisch).

Dieses Feld scheint Ihr Decompiler fälschlicherweise als Clazz.this darzustellen.

    
NPE 25.03.2013, 11:17
quelle
4

Sie können sich einfach den Bytecode ( javap -c Clazz.class ) ansehen.

Mit int i = 300 :

%Vor%

Mit Integer i = 300 :

%Vor%

Also ist int inline, aber Integer nicht.

Auch für die Aufzeichnung, das ist, was ich von jd-gui (3.0.5) bekomme:

%Vor%     
assylias 25.03.2013 11:22
quelle
0

Es sollte ein nächster Ansatz sein, bei dem jd-gui fehlschlägt, wie Integer -Objekt seinen Wert out-boxt, wenn System.out.println aufgerufen wurde. Der Dekompilierungsalgorithmus selbst muss annehmen, was der wichtigste Verweis auf dieses Integer -Objekt ist, und er wählt das Ergebnis von Clazz.this .

    
Dion Dirza 25.03.2013 11:25
quelle

Tags und Links