Java bytecode lies at the foundation of the the entire Java ecosystem. Regardless of what language and tools you use, if you run on the JVM, you’re using Java bytecode. Although understanding bytecode is not a requirement for all developers, a deeper understanding of how your code runs on the JVM can make understanding and resolving certain types of issues much easier. Understanding bytecode also opens the door to more-advanced techniques such as bytecode instrumentation via JVMTI and writing your own Java agent. This session starts at the very beginning and covers all the basics, with a heavy emphasis on examples.
3. JVM Sustaining Engineer
OpenJDK 8 Update Project
Maintainer
JavaOne Rock Star
Co-author of Oracle WebLogic
Server 11g 構築・運用ガイド
@DavidBuckJP
https://blogs.oracle.com/buck/
Who am I? David Buck (left)
58. but some types are more equal than
others…
Actual type
Computational
type
Category
Boolean int 1
byte int 1
char int 1
short int 1
int int 1
float float 1
reference reference 1
returnAddress returnAddress 1
long long 2
double double 2
59. int spin
void spin() {
int i;
for (i = 0; i < 100; i++) {
;// empty
}
}
void spin();
Code:
stack=2, locals=2,
args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: bipush 100
5: if_icmpge 14
8: iinc 1, 1
11: goto 2
14: return
StackLocals
this
i
int 1
int 0
60. double spin
void dspin() {
double i;
for (i = 0.0; i < 100.0; i++) {
; //empty
}
}
void dspin();
stack=4, locals=3,
args_size=1
0: dconst_0
1: dstore_1
2: dload_1
3: ldc2_w #2
// double 100.0d
6: dcmpg
7: ifge 17
10: dload_1
11: dconst_1
12: dadd
13: dstore_1
14: goto 2
17: returnStackLocals
this
i (1 of 2)
d1 (2 of 2)
d1 (1 of 2)
i (2 of 2)
d0 (2 of 2)
d0 (1 of 2)
74. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
75. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
76. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
StackLocals
this
i
j
77. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
StackLocals
this
i
i
j
78. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
StackLocals
this
i
i
j j
79. argument passing (virtual)
int addTwo(int i, int j) {
return i + j;
}
int addTwo(int, int);
stack=2, locals=3,
args_size=3
0: iload_1
1: iload_2
2: iadd
3: ireturn
StackLocals
this
i
i+j
j
94. method call (private)
class Near {
int it;
public int getItNear() {
return getIt();
}
private int getIt() {
return it;
}
}
95. method call (private)
class Near {
int it;
public int getItNear() {
return getIt();
}
private int getIt() {
return it;
}
}
public int getItNear();
stack=1, locals=1,
args_size=1
0: aload_0
1: invokespecial #3
// Method getIt:()I
4: ireturn
96. method call (super class)
class Far extends Near {
int getItFar() {
return super.getItNear();
}
}
97. method call (private)
class Far extends Near {
int getItFar() {
return super.getItNear();
}
}
int getItFar();
Code:
stack=1, locals=1,
args_size=1
0: aload_0
1: invokespecial #3
// Method
Examples3_7$Near.getItNaer:
()I
4: ireturn
103. types of calls
invokevirtual
instance method
this pointer
virtual lookup
invokestatic
class method
no this pointer
static linking
invokeinterface
interface method
this pointer
virtual lookup
104. types of calls
invokevirtual
instance method
this pointer
virtual lookup
invokestatic
class method
no this pointer
static linking
invokeinterface
interface method
this pointer
virtual lookup
invokespecial
Everything else
constructors
super class
private
this pointer
static linking
105. When two Objects love each other very
much…
Object create() {
return new Object();
}
StackLocals
106. When two Objects love each other very
much…
Object create() {
return new Object();
}
java.lang.Object create();
stack=2, locals=1,
args_size=1
0: new #2
// class java/lang/Object
3: dup
4: invokespecial #1
// Method
java/lang/Object."<init>":(
)V
7: areturn
StackLocals
107. When two Objects love each other very
much…
Object create() {
return new Object();
}
java.lang.Object create();
stack=2, locals=1,
args_size=1
0: new #2
// class java/lang/Object
3: dup
4: invokespecial #1
// Method
java/lang/Object."<init>":(
)V
7: areturn
StackLocals
baby
108. When two Objects love each other very
much…
Object create() {
return new Object();
}
java.lang.Object create();
stack=2, locals=1,
args_size=1
0: new #2
// class java/lang/Object
3: dup
4: invokespecial #1
// Method
java/lang/Object."<init>":(
)V
7: areturn
StackLocals
baby
baby
109. When two Objects love each other very
much…
Object create() {
return new Object();
}
java.lang.Object create();
stack=2, locals=1,
args_size=1
0: new #2
// class java/lang/Object
3: dup
4: invokespecial #1
// Method
java/lang/Object."<init>":(
)V
7: areturn
StackLocals
baby
110. field access
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
StackLocals
111. field access (set)
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
void setIt(int);
stack=2, locals=2,
args_size=2
0: aload_0
1: iload_1
2: putfield #6
// Field i:I
5: return
StackLocals
112. field access (set)
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
void setIt(int);
stack=2, locals=2,
args_size=2
0: aload_0
1: iload_1
2: putfield #6
// Field i:I
5: return
StackLocals
this
113. field access (set)
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
void setIt(int);
stack=2, locals=2,
args_size=2
0: aload_0
1: iload_1
2: putfield #6
// Field i:I
5: return
StackLocals
this
value
114. field access (set)
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
void setIt(int);
stack=2, locals=2,
args_size=2
0: aload_0
1: iload_1
2: putfield #6
// Field i:I
5: return
StackLocals
115. field access (get)
int i
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
int getIt();
stack=1, locals=1,
args_size=1
0: aload_0
1: getfield #6
// Field i:I
4: ireturn
StackLocals