java bytecode fundamentals - jug.lv

87

Upload: anton-arhipov

Post on 10-May-2015

3.005 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Java Bytecode Fundamentals - JUG.lv
Page 2: Java Bytecode Fundamentals - JUG.lv

Java Bytecode Fundamentals

JUG.LV 2011, Riga

Page 3: Java Bytecode Fundamentals - JUG.lv

whoami

http://arhipov.blogspot.com@antonarhipov

@javarebel

Anton ArhipovZeroTurnaround

JRebel

Page 4: Java Bytecode Fundamentals - JUG.lv

who-are-you?

Page 5: Java Bytecode Fundamentals - JUG.lv

1 + 2

Page 6: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

Page 7: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 +

Page 8: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 +

Page 9: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 + PUSH 1 1

Page 10: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 + PUSH 1PUSH 2

21

Page 11: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 + PUSH 1PUSH 2ADD

3

Page 12: Java Bytecode Fundamentals - JUG.lv

1 + 21 2

+

1 2 + ICONST_1ICONST_2IADD

3

Page 13: Java Bytecode Fundamentals - JUG.lv

? = 1 + 2

Page 14: Java Bytecode Fundamentals - JUG.lv

Byte Code

One-byte instructions256 possible opcodes~200 in use

Page 15: Java Bytecode Fundamentals - JUG.lv

Byte Code

One-byte instructions256 possible opcodes~200 in use

Page 16: Java Bytecode Fundamentals - JUG.lv
Page 17: Java Bytecode Fundamentals - JUG.lv

The Master Plan

javapStack MachineObjects and MethodsFlow Control

Page 18: Java Bytecode Fundamentals - JUG.lv

javap

Java class file disassemblerUsed 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

Page 19: Java Bytecode Fundamentals - JUG.lv

C:\work\jug\classes>javap Hello -cCompiled from "Hello.java"public class Hello extends java.lang.Object{public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()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

Page 20: Java Bytecode Fundamentals - JUG.lv

C:\work\jug\classes>javap Hello -verboseCompiled 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."<init>":()Vconst #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;)Vconst #5 = class #26; // Helloconst #6 = class #27; // java/lang/Objectconst #7 = Asciz <init>;const #8 = Asciz ()V;

Page 21: Java Bytecode Fundamentals - JUG.lv

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."<init>":()V 4: return LineNumberTable: line 1: 0

LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;

Page 22: Java Bytecode Fundamentals - JUG.lv

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;

Page 23: Java Bytecode Fundamentals - JUG.lv

Stack Machine

JVM is a stack-based machineEach thread has a stackStack stores framesFrame is created on method invocationFrame:

Operand stackArray of local variables

Page 24: Java Bytecode Fundamentals - JUG.lv

Frame

Page 25: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 26: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

aload_0 getfield

00 02 areturn

0 1 2 3 4

Page 27: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

2A B4 00 02 B0

0 1 2 3 4

Page 28: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 29: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 30: Java Bytecode Fundamentals - JUG.lv

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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 31: Java Bytecode Fundamentals - JUG.lv

Stack Operations

AB

duppopswapdup_x1dup_x2

Page 32: Java Bytecode Fundamentals - JUG.lv

Stack Operations

A

B

duppopswapdup_x1dup_x2

A

Page 33: Java Bytecode Fundamentals - JUG.lv

Stack Operations

duppopswapdup_x1dup_x2

AB

Page 34: Java Bytecode Fundamentals - JUG.lv

Stack Operations

duppopswapdup_x1dup_x2

AB

Page 35: Java Bytecode Fundamentals - JUG.lv

Stack Operations

duppopswapdup_x1dup_x2

AB

B

Page 36: Java Bytecode Fundamentals - JUG.lv

Stack Operations

duppopswapdup_x1dup_x2

AB

BBA

Page 37: Java Bytecode Fundamentals - JUG.lv

Local Variables

Page 38: Java Bytecode Fundamentals - JUG.lv

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

Page 39: Java Bytecode Fundamentals - JUG.lv

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

numbered

from 0

Page 40: Java Bytecode Fundamentals - JUG.lv

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

instance methodshave this at 0

Page 41: Java Bytecode Fundamentals - JUG.lv

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

Page 42: Java Bytecode Fundamentals - JUG.lv

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

Page 43: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

0

1

2

3

4

0

1

2

3

4

Page 44: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

Page 45: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

Page 46: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

Page 47: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

Page 48: Java Bytecode Fundamentals - JUG.lv

Local Variables

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var

value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

"Hello"

Page 49: Java Bytecode Fundamentals - JUG.lv

Local Variables & Stack

StackLocal

Variables Table

store

load

Page 50: Java Bytecode Fundamentals - JUG.lv

Object Initialization

new <init> <clinit>

Instance initialization method

Class and interface

initialization method

Page 51: Java Bytecode Fundamentals - JUG.lv

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

Page 52: Java Bytecode Fundamentals - JUG.lv

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

<clinit>

Page 53: Java Bytecode Fundamentals - JUG.lv

Object Initialization: new

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

Page 54: Java Bytecode Fundamentals - JUG.lv

Object Initialization: new

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

Page 55: Java Bytecode Fundamentals - JUG.lv

Object Initialization: {}

Page 56: Java Bytecode Fundamentals - JUG.lv

Object Initialization: {}

?

Page 57: Java Bytecode Fundamentals - JUG.lv

Object Initialization: {}

public Initializer(int); Code: 0: aload_0 1: invokespecial #1; // ..<init> 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

Page 58: Java Bytecode Fundamentals - JUG.lv

Method Invocation

invokestaticinvokeinterfaceinvokevirtualinvokespecialinvokedynamic

Page 59: Java Bytecode Fundamentals - JUG.lv

Parameter Passing

Page 60: Java Bytecode Fundamentals - JUG.lv

Parameter Passing

parameter

returnvalue

Page 61: Java Bytecode Fundamentals - JUG.lv

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();

Page 62: Java Bytecode Fundamentals - JUG.lv

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

Page 63: Java Bytecode Fundamentals - JUG.lv

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

Page 64: Java Bytecode Fundamentals - JUG.lv

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

Page 65: Java Bytecode Fundamentals - JUG.lv

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

Page 66: Java Bytecode Fundamentals - JUG.lv

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

Page 67: Java Bytecode Fundamentals - JUG.lv

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

Page 68: Java Bytecode Fundamentals - JUG.lv

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

Page 69: Java Bytecode Fundamentals - JUG.lv

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

Page 70: Java Bytecode Fundamentals - JUG.lv

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

Page 71: Java Bytecode Fundamentals - JUG.lv

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

Page 72: Java Bytecode Fundamentals - JUG.lv

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

Page 73: Java Bytecode Fundamentals - JUG.lv

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

Page 74: Java Bytecode Fundamentals - JUG.lv

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

Page 75: Java Bytecode Fundamentals - JUG.lv

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

Page 76: Java Bytecode Fundamentals - JUG.lv

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

Page 77: Java Bytecode Fundamentals - JUG.lv

Flow Control

Page 78: Java Bytecode Fundamentals - JUG.lv

Flow Control

GOTO

Page 79: Java Bytecode Fundamentals - JUG.lv

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

Page 80: Java Bytecode Fundamentals - JUG.lv

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

Page 81: Java Bytecode Fundamentals - JUG.lv

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

10a

Page 82: Java Bytecode Fundamentals - JUG.lv

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

10a

Page 83: Java Bytecode Fundamentals - JUG.lv

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

Page 84: Java Bytecode Fundamentals - JUG.lv

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

Page 85: Java Bytecode Fundamentals - JUG.lv

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

Page 86: Java Bytecode Fundamentals - JUG.lv

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

Page 87: Java Bytecode Fundamentals - JUG.lv

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