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
Levels of AI-assisted programming
antonarhipov
0
3
Devoxx France 2024. Kotlin - the new and noteworthy
antonarhipov
1
24
Harnessing the power of AI in IntelliJ IDEA
antonarhipov
1
120
VirtualJUG: Kotlin 2.0 and beyond
antonarhipov
1
110
Kotlin 2.1: Language Updates
antonarhipov
3
110
Devoxx Belgium 2024 - Kotlin 2.0 and beyond
antonarhipov
2
150
Data Analysis with Kotlin Notebook, DataFrame, and Kandy
antonarhipov
1
65
Kotlin 2.0 and Beyond
antonarhipov
2
230
Kotlin Standard Library Gems
antonarhipov
2
500
Other Decks in Programming
See All in Programming
ソフトウェア品質特性、意識してますか?AIの真の力を引き出す活用事例 / ai-and-software-quality
minodriven
19
6.5k
Perlで痩せる
yuukis
1
580
OpenTelemetry + LLM = OpenLLMetry!?
yunosukey
2
360
AIにコードを生成するコードを作らせて、再現性を担保しよう! / Let AI generate code to ensure reproducibility
yamachu
7
6k
知識0からカンファレンスやってみたらこうなった!
syossan27
5
320
抽象データ型について学んだ
ryounasso
0
200
What Spring Developers Should Know About Jakarta EE
ivargrimstad
1
490
Practical Domain-Driven Design - Workshop at NDC 2025
mufrid
0
120
Cloudflare Workersで進めるリモートMCP活用
syumai
13
1.9k
rbs-traceを使ってWEARで型生成を試してみた After RubyKaigi 2025〜ZOZO、ファインディ、ピクシブ〜 / tried rbs-trace on WEAR
oyamakei
0
650
インターフェース設計のコツとツボ
togishima
2
420
AIコーディングの本質は“コード“ではなく“構造“だった / The essence of AI coding is not “code” but "structure
seike460
PRO
2
700
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
460
Making the Leap to Tech Lead
cromwellryan
133
9.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Designing for Performance
lara
608
69k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
GitHub's CSS Performance
jonrohan
1031
460k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
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
ant.arhipov@gmail.com http://arhipov.blogspot.com @antonarhipov @javarebel