Bytecode LCMP - Verständnisproblem

stroggi

Mitglied
Hi zusammen,

habe eine eher spezielle Frage, welche ich keinem Unterforum direkt zuordnen konnte, daher habe ich das Thema mal hier aufgemacht.

Es geht darum, dass ich den Ablauf im Bytecode bei der Initialisierung der Konstanten in der java/lang/System.class nicht ganz nachvollziehen kann. Ich beziehe mich hierbei auf die Version in JAVA 1.6 (die genaue Versionsbezeichnung weiß ich genau).

Bei der Initialisierungsmethode für dir Konstanten wird z.B. die Methode "nullInputStream" aufgerufen:
Java:
  0 invokestatic #329 <java/lang/System.currentTimeMillis>
 3 lconst_0
 4 lcmp
 5 ifle 10 (+5)
 8 aconst_null
 9 areturn
10 new #155 <java/lang/NullPointerException>
13 dup
14 invokespecial #307 <java/lang/NullPointerException.<init>>
17 athrow

Hier wird zuerst die aktuelle Systemzeit in Millisekunden (eine von 0 verschiedene positive Zahl, z.B. 1234) und anschließend die Konstante 0 auf den Stack geladen. Der Nächste OpCode (LCMP) soll nun diese Zahlen vergleichen (siehe HIER). Auf dem Stack liegen also nun als value2 die 0 und als value1 die 1234. Nach Aussage der Befehlsreferenz ist das Ergebnis demnach -1, da value2 kleiner ist als value1. Auf den Stack wird nun also die -1 gelegt.
der nächste OpCode (IFLE) führt nun einen Branch aus, wenn der auf dem Stack liegende Wert kleiner ist als 0. Da der oberste Wert auf dem Stack ja die -1 ist wird nun dieser Branch ausgeführt und anschließend eine Exception geworfen.

Mein Problem ist nun, dass ich das ganze für arg unlogisch halte, da diese Methode ja eigentlich ausgeführt werden muss, bevor mit System.out.println("...") ein String auf die Konsole gezaubert wird, hierbei jedoch nie eine Exception geworfen wird.
Habe ich den Bytecode nun falsch interpretiert, oder habe ich irgendwo etwas übersehen.

Für eure Hilfe wäre ich wirklich sehr dankbar.
 

Tobse

Top Contributor
Man werfe einen Blick in den Sourcecode (GrepCode: java.lang.System (.java) - Class - Source Code View
Java:
if (currentTimeMillis() > 0)
{
    return null;
}
throw new NullPointerException();
Heisst soviel wie: gibt immer null zurück.

Ich halte es aber für wahrscheinlich, dass der Rückgabewert von currentTimeMillis eine Aussage darüber trifft, inwieweit die JVM schon initialisiert ist.
 

stroggi

Mitglied
Nunja, soweit hab ich ads ja auch verstanden, aber warum wird dann im Bytecode mit IFLE geprüft? Müsste dann nicht mit IFGT geprüft werden, wenn als value2 0 und als value1 eine Zahl größer als 0 steht? Weil dann ist ja die Überprüfung immer die, dass es kleiner ist.
Oder müsste nicht value2 und value1 getauscht werden?

Ich will ja jetzt nicht sagen, dass die JVM falsch wäre, aber irgendwie ist die Dokumentation da scheinbar nicht ganz klar. Zumindest für mich. Beim oben aufgeführten OpCode (LCMP) z.B. verstehe ich die Auflistung des Stack so, dass "value2 word2" das Element ist, welches als erstes vom Stack geholt wird. Vielleicht ist ja auch hier mein Denkfehler. Aber dafür ist die Position von "result" dann wieder leicht irreführend (da ein Stack ja normalerweise von oben nach unten "wächst").
 
Zuletzt bearbeitet:

stroggi

Mitglied
So, das Problem scheint gelöst.

Heute kam endlich das Buch "Inside the JAVA 2 Virtual Machine" in dem die JVM und alle Bytecodes beschrieben sind bei mir an. In diesem ist zwar der Stackaufbau genauso beschrieben wie in der oben verlinkten Dokumentation zu LCMP, jedoch ist der Vergleich der beiden Werte value1 und value2 umgekehr beschrieben:

Online-Dokumentation: If same, pushes 0; else if value 2 greater, pushes 1; else pushes -1
Buch: If same, pushes 0; else if value 1 greater, pushes 1; else pushes -1

Damit klappts dann auch mit der Methode ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Tool mit dem man die Major version im Bytecode patchen kann..? Allgemeine Java-Themen 10
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
F Java Bytecode lesen Allgemeine Java-Themen 5
T Bytecode a7 Allgemeine Java-Themen 10
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
MQue Bytecode ansehen Allgemeine Java-Themen 13
L Hat sich der Bytecode von 1.5 nach 1.6 geändert? Allgemeine Java-Themen 25
M Bytecode eines Methodenaufrufs Allgemeine Java-Themen 7
R Klammern im Bytecode Allgemeine Java-Themen 11
G Bytecode zu Java-Opcode. Allgemeine Java-Themen 4
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
M Bytecode mit Java-Programm erzeugen lassen Allgemeine Java-Themen 20
S was wird optimiert ? klassen, bytecode oder interpreter? Allgemeine Java-Themen 12
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
H Listener Verständnisproblem Allgemeine Java-Themen 5
I Verständnisproblem mit nicht vorhandener Klasse Allgemeine Java-Themen 4
K OCJP Beispielfrage.. Verständnisproblem Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
S iText PDF - Verständnisproblem beim Update von TableCells (Seitenzahlen) Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
H Verständnisproblem mit Decimalseperator Allgemeine Java-Themen 2
G Verständnisproblem Allgemeine Java-Themen 11
A Verständnisproblem zur Hashtable Allgemeine Java-Themen 10
A Verständnisproblem Allgemeine Java-Themen 9
A Verständnisproblem mit GregorianCalendar Allgemeine Java-Themen 10
T Verständnisproblem Allgemeine Java-Themen 16
G Verständnisproblem double und float Allgemeine Java-Themen 7
R ResourceBundle-Verständnisproblem Allgemeine Java-Themen 3
M Class#getClassLoader - Verständnisproblem Allgemeine Java-Themen 3
M Verständnisproblem bei mehrdimensionalen Arrays Allgemeine Java-Themen 3
S verständnisproblem bei File Allgemeine Java-Themen 6
L Verständnisproblem ? Allgemeine Java-Themen 3
V Verständnisproblem Eclipse BuildPath <-> Import Jar Fi Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben