Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Java bytecode fundamentals
Search
Anton Arhipov
March 03, 2011
Programming
2
220
Java bytecode fundamentals
Anton Arhipov
March 03, 2011
Tweet
Share
More Decks by Anton Arhipov
See All by Anton Arhipov
Kotlin 2.1: Language Updates
antonarhipov
3
60
Devoxx Belgium 2024 - Kotlin 2.0 and beyond
antonarhipov
2
120
Data Analysis with Kotlin Notebook, DataFrame, and Kandy
antonarhipov
1
25
Kotlin 2.0 and Beyond
antonarhipov
2
190
Kotlin Standard Library Gems
antonarhipov
2
460
Ktor Workshop
antonarhipov
1
93
Everybody is a Marketer
antonarhipov
0
120
Idiomatic Kotlin, v2023.05
antonarhipov
2
140
Kotlin DSL in under an hour, DevoxxUK 2023
antonarhipov
2
130
Other Decks in Programming
See All in Programming
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
460
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
240
As an Engineers, let's build the CRM system via LINE Official Account 2.0
clonn
1
670
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
160
HTTP compression in PHP and Symfony apps
dunglas
2
1.6k
第5回日本眼科AI学会総会_AIコンテスト_3位解法
neilsaw
0
170
似たもの同士のPerlとPHP
uzulla
1
120
Thoughts and experiences on Rust and TypeScript
unvalley
2
230
たのしいparse.y
ydah
3
120
あれやってみてー駆動から成長を加速させる / areyattemite-driven
nashiusagi
1
200
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
1
320
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
Typedesign – Prime Four
hannesfritz
40
2.4k
Fireside Chat
paigeccino
34
3.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Speed Design
sergeychernyshev
25
670
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
Testing 201, or: Great Expectations
jmmastey
40
7.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Building Applications with DynamoDB
mza
91
6.1k
Transcript
None
Java Bytecode Fundamentals JUG.LV 2011, Riga
whoami http://arhipov.blogspot.com @antonarhipov @javarebel Anton Arhipov ZeroTurnaround JRebel
who-are-you?
1 + 2
1 + 2 1 2 +
1 + 2 1 2 + 1 2 +
1 + 2 1 2 + 1 2 +
1 + 2 1 2 + 1 2 + PUSH
1 1
1 + 2 1 2 + 1 2 + PUSH
1 PUSH 2 2 1
1 + 2 1 2 + 1 2 + PUSH
1 PUSH 2 ADD 3
1 + 2 1 2 + 1 2 + ICONST_1
ICONST_2 IADD 3
? = 1 + 2
Byte Code One-byte instructions 256 possible opcodes ~200 in use
Byte Code One-byte instructions 256 possible opcodes ~200 in use
None
The Master Plan javap Stack Machine Objects and Methods Flow
Control
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
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."<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
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."<init>":()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 <init>; const #8 = Asciz ()V;
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;
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;
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
Frame
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;
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
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
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;
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;
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;
Stack Operations A B dup pop swap dup_x1 dup_x2
Stack Operations A B dup pop swap dup_x1 dup_x2 A
Stack Operations dup pop swap dup_x1 dup_x2 A B
Stack Operations dup pop swap dup_x1 dup_x2 A B
Stack Operations dup pop swap dup_x1 dup_x2 A B B
Stack Operations dup pop swap dup_x1 dup_x2 A B B
B A
Local Variables
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
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
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
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
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
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
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
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
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
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
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"
Local Variables & Stack Stack Local Variables Table store load
Object Initialization new <init> <clinit> Instance initialization method Class and
interface initialization method
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
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>
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
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
Object Initialization: {}
Object Initialization: {}
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
Method Invocation invokestatic invokeinterface invokevirtual invokespecial invokedynamic
Parameter Passing
Parameter Passing parameter return value
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();
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Flow Control
Flow Control GOTO
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
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
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
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
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
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
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
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
[email protected]
http://arhipov.blogspot.com @antonarhipov @javarebel