JVM Internals - Garbage Collection & Runtime Optimizations

4,416 views

Published on

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

Published in: Technology

JVM Internals - Garbage Collection & Runtime Optimizations

  1. 1. JVM Internals Douglas Q. Hawkins Sunday, August 15, 2010
  2. 2. JVM Internals Bytecode Garbage Collection Optimizations Compile Time Run Time Sunday, August 15, 2010
  3. 3. Java Bytecode Sunday, August 15, 2010
  4. 4. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space Sunday, August 15, 2010
  5. 5. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space 3 Sunday, August 15, 2010
  6. 6. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space 7 3 Sunday, August 15, 2010
  7. 7. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space 7 + 3 Sunday, August 15, 2010
  8. 8. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space 3+ 7 Sunday, August 15, 2010
  9. 9. Java Bytecode Local Variables Stack Based Operand Stack Local Variable Space 10 Sunday, August 15, 2010
  10. 10. Operation Types Load and Store Arithmetic and Logic Type Conversion Control Transfer Object Creation and Manipulation Operand Stack Method Invocation Sunday, August 15, 2010
  11. 11. Demo Sunday, August 15, 2010
  12. 12. Garbage Collection Sunday, August 15, 2010
  13. 13. 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
  14. 14. Generational Garbage Collection Young Generation Eden Survivor Spaces Old Generation Tenured Sunday, August 15, 2010
  15. 15. Generational Garbage Collection Young Generation Eden A B Survivor Spaces Old Generation Tenured Sunday, August 15, 2010
  16. 16. Generational Garbage Collection Young Generation Eden A B C D Survivor Spaces Old Generation Tenured Sunday, August 15, 2010
  17. 17. Generational Garbage Collection Young Generation Eden A B C D E F G Survivor Spaces Old Generation Tenured Sunday, August 15, 2010
  18. 18. Generational Garbage Collection Young Generation Eden A B C D E F G Survivor Spaces Old Generation Tenured Sunday, August 15, 2010
  19. 19. Generational Garbage Collection Young Generation Eden A C D G Survivor B E F Spaces Old Generation Tenured Sunday, August 15, 2010
  20. 20. Generational Garbage Collection Young Generation Eden Survivor B E F Spaces Old Generation Tenured Sunday, August 15, 2010
  21. 21. Generational Garbage Collection Young Generation Eden H I J K L M N Survivor B E F Spaces Old Generation Tenured Sunday, August 15, 2010
  22. 22. Generational Garbage Collection Young Generation Eden H I J K L M N Survivor B E F Spaces Old Generation Tenured Sunday, August 15, 2010
  23. 23. Generational Garbage Collection Young Generation Eden H I K L M N Survivor F B E J Spaces Old Generation Tenured Sunday, August 15, 2010
  24. 24. Generational Garbage Collection Young Generation Eden Survivor B E J Spaces Old Generation Tenured Sunday, August 15, 2010
  25. 25. Generational Garbage Collection Young Generation Eden Survivor Spaces Old Generation Tenured B E J Sunday, August 15, 2010
  26. 26. Demo Sunday, August 15, 2010
  27. 27. 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
  28. 28. Optimizations Sunday, August 15, 2010
  29. 29. Optimizations Just In Time Compilation Purely Interpreted Ahead of Time Compilation Almost No Compile Time Optimization Most Optimizations are Runtime Sunday, August 15, 2010
  30. 30. Compile Time Demo Sunday, August 15, 2010
  31. 31. 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
  32. 32. 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(); How many...? sumV += vector.getV(); Loop Iterations } Heap Allocations } Method Invocations Lock Operations Sunday, August 15, 2010
  33. 33. 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(); How many...? sumV += vector.getV(); Loop Iterations 100 } Heap Allocations 100 } Method Invocations 200 Lock Operations 100 Sunday, August 15, 2010
  34. 34. 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(); How many...? sumV += vector.getV(); Loop Iterations 0 } Heap Allocations 0 } Method Invocations 0 Lock Operations 0 Sunday, August 15, 2010
  35. 35. Common Sub-Expression Elimination int x = a + b; int y = a + b; Sunday, August 15, 2010
  36. 36. Common Sub-Expression Elimination int x = a + b; int y = a + b; int tmp = a + b; int x = tmp; int y = tmp; Sunday, August 15, 2010
  37. 37. Array Bounds Check Elimination int[] nums = ... for ( int i = 0; i < nums.length; ++i ) { System.out.println( “nums[“ + i + “]=” + nums[ i ] ); } Sunday, August 15, 2010
  38. 38. Array Bounds Check Elimination int[] 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
  39. 39. Loop Invariant Hoisting for ( int i = 0; i < nums.length; ++i ) { ... } Sunday, August 15, 2010
  40. 40. 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
  41. 41. Loop Unrolling int sum = 0; for ( int i = 0; i < 10; ++i ) { sum += i; } Sunday, August 15, 2010
  42. 42. 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
  43. 43. Method Inlining Vector vector = ... double magnitude = vector.magnitude(); Sunday, August 15, 2010
  44. 44. Method Inlining Vector vector = ... double magnitude = vector.magnitude(); Vector vector = ... double magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v ); Sunday, August 15, 2010
  45. 45. Method Inlining Vector 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
  46. 46. Method Inlining Vector vector = ... double magnitude = vector.magnitude(); static always Vector vector = ... final always double magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v ); private always virtual often Vector vector = ... reflective sometimes double magnitude; if ( vector instance of Vector2D ) { dynamic often magnitude = Math.sqrt( vector.u*vector.u + vector.v*vector.v ); } else { magnitude = vector.magnitude(); } Sunday, August 15, 2010
  47. 47. Lock Coarsening StringBuffer buffer = ... buffer.append( “Hello” ); buffer.append( name ); buffer.append( “n” ); Sunday, August 15, 2010
  48. 48. Lock Coarsening StringBuffer 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
  49. 49. Lock Coarsening StringBuffer 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
  50. 50. Other Lock Optimizations Biased Locking Adaptive Locking - Thread sleep vs. Spin lock Sunday, August 15, 2010
  51. 51. Escape Analysis Point p1 = new Point( x1, y1 ), p2 = new Point( x2, y2 ); synchronized ( p1 ) { synchronized ( p2 ) { double dx = p1.getX() - p2.getX(); double dy = p1.getY() - p2.getY(); double distance = Math.sqrt( dx*dx + dy*dy ); } } Sunday, August 15, 2010
  52. 52. Escape Analysis Point 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
  53. 53. Escape Analysis Point 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
  54. 54. Run Time Demo Sunday, August 15, 2010
  55. 55. 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

×