JVM Internals - Garbage Collection & Runtime Optimizations
-
Upload
douglas-hawkins -
Category
Technology
-
view
3.912 -
download
3
description
Transcript of JVM Internals - Garbage Collection & Runtime Optimizations
JVM InternalsDouglas Q. Hawkins
Sunday, August 15, 2010
JVM Internals
Bytecode
Garbage Collection
Optimizations
Compile Time
Run Time
Sunday, August 15, 2010
Java Bytecode
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
3
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
37
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
37 +
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
3 7+
Sunday, August 15, 2010
Java Bytecode
Stack Based
Local Variable Space
Local Variables
Operand Stack
10
Sunday, August 15, 2010
Operation Types
Load and Store
Arithmetic and Logic
Type Conversion
Control Transfer
Object Creation and Manipulation
Operand Stack
Method Invocation
Sunday, August 15, 2010
Demo
Sunday, August 15, 2010
Garbage Collection
Sunday, August 15, 2010
Garbage Collection
Generational Garbage Collection
Segmented into Young, Old, and Permanent Generations
Types of Collectors
Parallel - across multiple threads
Concurrent - while program runs
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
A B
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
A B C D
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
A B C D E F G
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
A B C D E F G
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
A
B
C D
E F
G
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
B E F
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
B E F
H I J K L M N
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
B E F
H I J K L M N
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
B EF
H I
J
K L M N
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured
B E J
Sunday, August 15, 2010
Generational Garbage Collection
Young Generation
Eden
SurvivorSpaces
Old Generation
Tenured B E J
Sunday, August 15, 2010
Demo
Sunday, August 15, 2010
Garbage Collection Pattern
Minor
Major
Major Again - for objects with finalize
Soft References
Major
Major Again - for objects with finalize
Throw OutOfMemoryError
Sunday, August 15, 2010
Optimizations
Sunday, August 15, 2010
Optimizations
Just In Time Compilation
Purely Interpreted
Ahead of Time Compilation
Almost No Compile Time Optimization
Most Optimizations are Runtime
Sunday, August 15, 2010
Compile Time Demo
Sunday, August 15, 2010
Is This Optimized?double sumU = 0, sumV = 0;for ( int i = 0; i < 100; ++i ) { Vector2D vector = new Vector2D( i, i ); synchronized ( vector ) { sumU += vector.getU(); sumV += vector.getV(); }}
Sunday, August 15, 2010
Is This Optimized?double sumU = 0, sumV = 0;for ( int i = 0; i < 100; ++i ) { Vector2D vector = new Vector2D( i, i ); synchronized ( vector ) { sumU += vector.getU(); sumV += vector.getV(); }}
How many...?
Loop Iterations
Heap Allocations
Method Invocations
Lock Operations
Sunday, August 15, 2010
Is This Optimized?double sumU = 0, sumV = 0;for ( int i = 0; i < 100; ++i ) { Vector2D vector = new Vector2D( i, i ); synchronized ( vector ) { sumU += vector.getU(); sumV += vector.getV(); }}
How many...?
Loop Iterations
Heap Allocations
Method Invocations
Lock Operations
100
100
200
100
Sunday, August 15, 2010
Is This Optimized?double sumU = 0, sumV = 0;for ( int i = 0; i < 100; ++i ) { Vector2D vector = new Vector2D( i, i ); synchronized ( vector ) { sumU += vector.getU(); sumV += vector.getV(); }}
How many...?
Loop Iterations
Heap Allocations
Method Invocations
Lock Operations
0
0
0
0
Sunday, August 15, 2010
Common Sub-Expression Eliminationint x = a + b;int y = a + b;
Sunday, August 15, 2010
Common Sub-Expression Eliminationint x = a + b;int y = a + b;
int tmp = a + b;int x = tmp;int y = tmp;
Sunday, August 15, 2010
Array Bounds Check Eliminationint[] nums = ...for ( int i = 0; i < nums.length; ++i ) {
System.out.println( “nums[“ + i + “]=” + nums[ i ] );}
Sunday, August 15, 2010
Array Bounds Check Eliminationint[] nums = ...for ( int i = 0; i < nums.length; ++i ) {
System.out.println( “nums[“ + i + “]=” + nums[ i ] );}
int[] nums = ...for ( int i = 0; i < nums.length; ++i ) { if ( i < 0 || i >= nums.length ) { throw new ArrayIndexOutOfBoundsException(); }
System.out.println( “nums[“ + i + “]=” + nums[ i ] );}
Sunday, August 15, 2010
Loop Invariant Hoisting
for ( int i = 0; i < nums.length; ++i ) {...}
Sunday, August 15, 2010
Loop Invariant Hoisting
for ( int i = 0; i < nums.length; ++i ) {...}
int length = nums.length;for ( int i = 0; i < length; ++i ) {...}
Sunday, August 15, 2010
Loop Unrolling
int sum = 0;for ( int i = 0; i < 10; ++i ) { sum += i;}
Sunday, August 15, 2010
Loop Unrolling
int sum = 0;for ( int i = 0; i < 10; ++i ) { sum += i;}
int sum = 0;sum += 1;...sum += 9;
Sunday, August 15, 2010
Method InliningVector vector = ...double magnitude = vector.magnitude();
Sunday, August 15, 2010
Method InliningVector vector = ...double magnitude = vector.magnitude();
Vector vector = ...double magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v );
Sunday, August 15, 2010
Method InliningVector vector = ...double magnitude = vector.magnitude();
Vector vector = ...double magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v );
Vector vector = ...double magnitude;if ( vector instance of Vector2D ) { magnitude = Math.sqrt(
vector.u*vector.u + vector.v*vector.v );} else { magnitude = vector.magnitude();}
Sunday, August 15, 2010
Method InliningVector vector = ...double magnitude = vector.magnitude();
Vector vector = ...double magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v );
Vector vector = ...double magnitude;if ( vector instance of Vector2D ) { magnitude = Math.sqrt(
vector.u*vector.u + vector.v*vector.v );} else { magnitude = vector.magnitude();}
static
final
private
virtual
reflective
dynamic
always
always
always
often
sometimes
often
Sunday, August 15, 2010
Lock CoarseningStringBuffer buffer = ...buffer.append( “Hello” );buffer.append( name );buffer.append( “\n” );
Sunday, August 15, 2010
Lock CoarseningStringBuffer buffer = ...buffer.append( “Hello” );buffer.append( name );buffer.append( “\n” );
StringBuffer buffer = ...lock( buffer ); buffer.append( “Hello” ); unlock( buffer );lock( buffer ); buffer.append( name ); unlock( buffer );lock( buffer ); buffer.append( “\n” ); unlock( buffer );
Sunday, August 15, 2010
Lock CoarseningStringBuffer buffer = ...buffer.append( “Hello” );buffer.append( name );buffer.append( “\n” );
StringBuffer buffer = ...lock( buffer ); buffer.append( “Hello” ); unlock( buffer );lock( buffer ); buffer.append( name ); unlock( buffer );lock( buffer ); buffer.append( “\n” ); unlock( buffer );
StringBuffer buffer = ...lock( buffer ); buffer.append( “Hello” );buffer.append( name );buffer.append( “\n” );unlock( buffer );
Sunday, August 15, 2010
Other Lock Optimizations
Biased Locking
Adaptive Locking - Thread sleep vs. Spin lock
Sunday, August 15, 2010
Escape AnalysisPoint p1 = new Point( x1, y1 ), p2 = new Point( x2, y2 );
synchronized ( p2 ) { double dx = p1.getX() - p2.getX();
synchronized ( p1 ) {
double dy = p1.getY() - p2.getY();
}}
double distance = Math.sqrt( dx*dx + dy*dy );
Sunday, August 15, 2010
Escape AnalysisPoint p1 = new Point( x1, y1 ), p2 = new Point( x2, y2 );
double dx = p1.getX() - p2.getX(); double dy = p1.getY() - p2.getY(); double distance = Math.sqrt( dx*dx + dy*dy );
Sunday, August 15, 2010
Escape AnalysisPoint p1 = new Point( x1, y1 ), p2 = new Point( x2, y2 );
double dx = p1.getX() - p2.getX(); double dy = p1.getY() - p2.getY(); double distance = Math.sqrt( dx*dx + dy*dy );
double dx = x1 - x2;double dx = y1 - y2;double distance = Math.sqrt( dx*dx + dy*dy );
Sunday, August 15, 2010
Run Time Demo
Sunday, August 15, 2010
Resources
Brian Goetz
Developer Works Articles
Tony Printezis
Garbage Collection in the Java HotSpot Virtual Machine - http://www.devx.com/Java/Article/21977
Java Specialist Newsletter - http://www.javaspecialists.eu/
http://java.sun.com/javase/6/docs/technotes/guides/vm/cms-6.html
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
http://www.fasterj.com/articles/G1.html
http://www.informit.com/guides/content.aspx?g=java&seqNum=27
Sunday, August 15, 2010