Java Bytecode Analysis and Optimization
Download
Report
Transcript Java Bytecode Analysis and Optimization
IPT
Readings on
Instrumentation,
Profiling, and Tracing
Seminar presentation by
Alessandra Gorla
University of Lugano
December 7, 2006
Java Bytecode Analysis and
Optimization
Soot
BCEL
JABA
Overview
Introduction
Tools
Soot - a Java Bytecode Optimization
Framework
BCEL - Byte Code Engineering Library
JABA - JAva Bytecode Analyzer
Introduction
Java application are usually much slower than C
and C++ applications.
Possible approaches to solve the problem
Bytecode optimizers
Significant optimizations. Create new classes
Bytecode annotators
Create new classes with annotations
Bytecode manipulation tools
Manipulate bytecode in its original form
Java application packagers
Compress and/or obfuscate code
Java native compilers
Compile Java to native executables
Soot
Bytecode optimizer framework
Intraprocedural optimization
Whole program optimization
Three intermediate representations
Baf: streamlined representation of the bytecode
Jimple: typed 3-address representation
Grimp: Jimple aggregated version
Baf
Constant pool
abstraction
Give type to dup
and swap
instructions
Local vars are given
explicit names
Jimple
3- address code
representation (not
for jsr)
Stack is replaced by
additional local vars
(prefixed by $)
Grimp
Much easier to read
than Baf of Jimple
Has a representation
of the new operator
Aggregate
expressions
Optimization framework
Optimizations
Intraprocedural optimizations
Constant propagation and folding
Conditional and unconditional branch elimination
Copy propagation
Dead assignment and unreachable code elimination
Expression aggregation
Whole program optimization (call graph)
Method inlining
(Devirtualization of method calls)
Experiments
BCEL
Bytecode manipulation library
Written in Java
Opensource
Offers capabilities to inspect, edit and create Java
binary classes
Package to represent class
Package to dynamically generate and modify classes
Code examples, utilities
BCEL Class representation
BCEL Class editing
BCEL - Optimization example
Push 0 or 1 to the stack to evaluate boolean
expressions
Combination of boolean expressions:
Keep pushing 0s and 1s to the stack
Algorithm to apply:
Replace IfInstruction branch target with ifne
branch target
BCEL - Optimization example
if((a == null) || (i < 2))
System.out.println("Ooops");
5: aload_0
6: ifnull
#13
9: iconst_0
10: goto
#14
13: iconst_1
14: nop
15: ifne
#36
18: iload_1
19: iconst_2
20: if_icmplt #27
23: iconst_0
24: goto
#28
27: iconst_1
28: nop
29: ifne
#36
32: iconst_0
33: goto
#37
36: iconst_1
37: nop
38: ifeq
#52
41: getstatic System.out
44: ldc
"Ooops"
46: invokevirtual println
52: return
10: aload_0
11: ifnull
#19
14: iload_1
15: iconst_2
16: if_icmpge #27
19: getstatic System.out
22: ldc
"Ooops"
24: invokevirtual println
27: return
JABA
Bytecode analyzer library
Graphs representation
Control Flow Graph
Class Control Flow Graph
Interclass Control Flow Graph
JABA - CFG
public void metodo(){
int x = 2;
int c = 3;
while(x > 0) {
c++;
x--;
}
}
JABA - ICFG