JVM Internals - Garbage Collection & Runtime Optimizations

Preview:

DESCRIPTION

Oct 2009 Meetup Presentation - focusing on Garbage Collection and Run Time Optimizations

Citation preview

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

Recommended