Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Java Bytecode Fundamentals JUG.LV 2011, Riga

Slide 3

Slide 3 text

whoami http://arhipov.blogspot.com @antonarhipov @javarebel Anton Arhipov ZeroTurnaround JRebel

Slide 4

Slide 4 text

who-are-you?

Slide 5

Slide 5 text

1 + 2

Slide 6

Slide 6 text

1 + 2 1 2 +

Slide 7

Slide 7 text

1 + 2 1 2 + 1 2 +

Slide 8

Slide 8 text

1 + 2 1 2 + 1 2 +

Slide 9

Slide 9 text

1 + 2 1 2 + 1 2 + PUSH 1 1

Slide 10

Slide 10 text

1 + 2 1 2 + 1 2 + PUSH 1 PUSH 2 2 1

Slide 11

Slide 11 text

1 + 2 1 2 + 1 2 + PUSH 1 PUSH 2 ADD 3

Slide 12

Slide 12 text

1 + 2 1 2 + 1 2 + ICONST_1 ICONST_2 IADD 3

Slide 13

Slide 13 text

? = 1 + 2

Slide 14

Slide 14 text

Byte Code One-byte instructions 256 possible opcodes ~200 in use

Slide 15

Slide 15 text

Byte Code One-byte instructions 256 possible opcodes ~200 in use

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

The Master Plan javap Stack Machine Objects and Methods Flow Control

Slide 18

Slide 18 text

javap Java class file disassembler Used with no options shows class structure only Methods, superclass, interfaces, etc -c – shows the bytecode -private – shows all classes and members -s – prints internal types signatures -l – prints lines numbers and local variable tables

Slide 19

Slide 19 text

C:\work\jug\classes>javap Hello -c Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

Slide 20

Slide 20 text

C:\work\jug\classes>javap Hello -verbose Compiled from "Hello.java“ public class Hello extends java.lang.Object SourceFile: "Hello.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #6.#20; // java/lang/Object."":()V const #2 = Field #21.#22; // java/lang/System.out:Ljava/io/PrintStream; const #3 = String #23; // Hello, World! const #4 = Method #24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V const #5 = class #26; // Hello const #6 = class #27; // java/lang/Object const #7 = Asciz ; const #8 = Asciz ()V;

Slide 21

Slide 21 text

C:\work\jug\classes>javap Hello -verbose … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;

Slide 22

Slide 22 text

C:\work\jug\classes>javap Hello -verbose … public static void main(java.lang.String[]); Code: Stack=2, Locals=1, Args_size=1 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 4: 0 line 5: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 args [Ljava/lang/String;

Slide 23

Slide 23 text

Stack Machine JVM is a stack-based machine Each thread has a stack Stack stores frames Frame is created on method invocation Frame: Operand stack Array of local variables

Slide 24

Slide 24 text

Frame

Slide 25

Slide 25 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Slide 26

Slide 26 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; aload_0 getfield 00 02 areturn 0 1 2 3 4

Slide 27

Slide 27 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet; 2A B4 00 02 B0 0 1 2 3 4

Slide 28

Slide 28 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Slide 29

Slide 29 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Slide 30

Slide 30 text

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Slide 31

Slide 31 text

Stack Operations A B dup pop swap dup_x1 dup_x2

Slide 32

Slide 32 text

Stack Operations A B dup pop swap dup_x1 dup_x2 A

Slide 33

Slide 33 text

Stack Operations dup pop swap dup_x1 dup_x2 A B

Slide 34

Slide 34 text

Stack Operations dup pop swap dup_x1 dup_x2 A B

Slide 35

Slide 35 text

Stack Operations dup pop swap dup_x1 dup_x2 A B B

Slide 36

Slide 36 text

Stack Operations dup pop swap dup_x1 dup_x2 A B B B A

Slide 37

Slide 37 text

Local Variables

Slide 38

Slide 38 text

Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I

Slide 39

Slide 39 text

Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I

Slide 40

Slide 40 text

Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I

Slide 41

Slide 41 text

Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I The table maps numbers to names

Slide 42

Slide 42 text

Local Variables public int calculate(int); Code: Stack=2, Locals=2, Args_size=2 … LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LLocalVariables; 0 5 1 value I Sized explicitly

Slide 43

Slide 43 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables 0 1 2 3 4 0 1 2 3 4

Slide 44

Slide 44 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables "Hello" 0 1 2 3 4 0 1 2 3 4

Slide 45

Slide 45 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables "Hello" 0 1 2 3 4 0 1 2 3 4

Slide 46

Slide 46 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables "Hello" 0 1 2 3 4 0 1 2 3 4 1

Slide 47

Slide 47 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables "Hello" 0 1 2 3 4 0 1 2 3 4 1

Slide 48

Slide 48 text

Local Variables ldc "Hello" astore_0 iconst_1 astore_1 aload_0 depth value Stack var value Local Variables "Hello" 0 1 2 3 4 0 1 2 3 4 1 "Hello"

Slide 49

Slide 49 text

Local Variables & Stack Stack Local Variables Table store load

Slide 50

Slide 50 text

Object Initialization new Instance initialization method Class and interface initialization method

Slide 51

Slide 51 text

Object Initialization: static {} static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return

Slide 52

Slide 52 text

Object Initialization: static {} static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return

Slide 53

Slide 53 text

Object Initialization: new public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: aload_0 5: new #2; //class java/lang/Object 8: dup 9: invokespecial #1; //Method java/lang/Object."":()V 12: putfield #3; //Field o:Ljava/lang/Object; 15: return

Slide 54

Slide 54 text

Object Initialization: new public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: aload_0 5: new #2; //class java/lang/Object 8: dup 9: invokespecial #1; //Method java/lang/Object."":()V 12: putfield #3; //Field o:Ljava/lang/Object; 15: return

Slide 55

Slide 55 text

Object Initialization: {}

Slide 56

Slide 56 text

Object Initialization: {}

Slide 57

Slide 57 text

Object Initialization: {} public Initializer(int); Code: 0: aload_0 1: invokespecial #1; // .. 4: aload_0 5: iconst_1 6: putfield #2; //Field a:I 9: aload_0 10: iconst_2 11: putfield #3; //Field c:I 14: aload_0 15: iload_1 16: putfield #4; //Field b:I 19: return

Slide 58

Slide 58 text

Method Invocation invokestatic invokeinterface invokevirtual invokespecial invokedynamic

Slide 59

Slide 59 text

Parameter Passing

Slide 60

Slide 60 text

Parameter Passing parameter return value

Slide 61

Slide 61 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables Stack 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute();

Slide 62

Slide 62 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); this Stack

Slide 63

Slide 63 text

0: aload_0 1: invokespecial #2; //createRandomValue() 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref Stack

Slide 64

Slide 64 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref Stack

Slide 65

Slide 65 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); this objectref Stack

Slide 66

Slide 66 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); this objectref objectref Stack

Slide 67

Slide 67 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref Stack

Slide 68

Slide 68 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref objectref Stack

Slide 69

Slide 69 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; // Integer.intValue:() 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref X Stack

Slide 70

Slide 70 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref 1 X Stack

Slide 71

Slide 71 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref X + 1 Stack

Slide 72

Slide 72 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; //Integer.valueOf 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref objectref Stack

Slide 73

Slide 73 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; //incValue 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref objectref Stack

Slide 74

Slide 74 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref objectref Stack

Slide 75

Slide 75 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref Stack

Slide 76

Slide 76 text

0: aload_0 1: invokespecial #2; 4: astore_1 5: aload_0 6: aload_1 7: invokespecial #3; 10: areturn depth value 1 2 3 4 5 6 1 2 3 var value Local Variables 1 2 3 var value 0: aload_1 1: invokevirtual #8; 4: iconst_1 5: iadd 6: invokestatic #7; 9: areturn private java.lang.Integer incValue(java.lang.Integer); public java.lang.Object execute(); objectref Stack

Slide 77

Slide 77 text

Flow Control

Slide 78

Slide 78 text

Flow Control GOTO

Slide 79

Slide 79 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack

Slide 80

Slide 80 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack a

Slide 81

Slide 81 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack 10 a

Slide 82

Slide 82 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack 10 a

Slide 83

Slide 83 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack

Slide 84

Slide 84 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack 100

Slide 85

Slide 85 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack 100

Slide 86

Slide 86 text

public int decide(int); Code: 0: iload_1 1: bipush 10 3: if_icmpge 8 6: iconst_0 7: ireturn 8: bipush 100 10: ireturn 1 2 3 depth value Stack

Slide 87

Slide 87 text

[email protected] http://arhipov.blogspot.com @antonarhipov @javarebel