淺談 Java GC 原理、調教和 新發展

10,382 views

Published on

淺談 Java GC 原理、調教和 新發展 - Java Developer Day 2014 @ Taiwan

Published in: Software

淺談 Java GC 原理、調教和 新發展

  1. 1. 淺談 Java GC 原理、調教和 新發展   Leon Chen 陳逸嘉 Java Architect 文曄科技
  2. 2. 陳逸嘉 (Leon  Chen) •  Master  of  NTHU  CS   •  More  than  15  years  in  Java/JEE,  as   programmer,  architect,  developer  leader  and   consultant,  in  finance/telecom  domain.   •  工研院 •  得捷 •  新光人壽 •  Ericsson   •  Oracle   •  文曄科技 (WT  Microelectronics)   2
  3. 3. 著作 •  TW  Patent  182927,  一種文章切割方法,  2003,  陳逸嘉,  林一中 •  TW  Patent  206819,  自動服務組合方法及系統,  2004,  陳逸嘉,  許維德,  洪 鵬翔 •  US  Patent  7,617,174,  Method  and  system  for  automaRc  service   composiRon,  2009,  Leon  Chen,  Wei-­‐Tek  Hsu,  Peng-­‐Hsiang  Hung   3
  4. 4. Garbage  CollecRon 4 我真的需要花時間去 Tune GC 嗎?
  5. 5. Performance  Impact  of  GC 5 Java  SE  6  HotSpot[tm]  Virtual  Machine  Garbage  CollecRon  Tuning   h[p://www.oracle.com/technetwork/java/javase/gc-­‐tuning-­‐6-­‐140523.html 0.6 0.2 8 32
  6. 6. 有資格被回收的物件? 6
  7. 7. Java  Memory  Management 7
  8. 8. Java  Memory  Management 8 h[ps://www.youtube.com/watch?v=450maTzSIvA  
  9. 9. Tracing  GC  Example 9
  10. 10. Tracing  GC  Example 10
  11. 11. Tracing  GC  Example 11
  12. 12. Tracing  GC  Example 12
  13. 13. Tracing  GC  Example 13
  14. 14. Tracing  GC  Example 14
  15. 15. JAVA  HEAP  STRUCTURE  AND  GC 15
  16. 16. Hotspot  JVM  Heap  Layout 16 Young   Old  (Tenured)   Permanent   Eden   From   To   Survivor  Spaces   NaRve   -­‐Xms  -­‐Xmx   -­‐XX:PermSize   -­‐XX:MaxPermSize   NO  
  17. 17. GC  Fundamentals   Garbage  DistribuRon  –  Objects  die  young 17
  18. 18. 18 GC  Fundamentals   Garbage  DistribuRon  –  Objects  die  young
  19. 19. Minor  GC  (Young  GeneraRon  GC) 19 Young   Old   Eden   From   To   Survivor  Spaces  
  20. 20. Minor  GC  (Young  GeneraRon  GC) 20 Young   Old   Eden   From   To   Survivor  Spaces   ! ! !! ! ! !
  21. 21. Minor  GC  (Young  GeneraRon  GC) 21 Young   Old   Eden   From   To   Survivor  Spaces   1 1 1
  22. 22. Minor  GC  (Young  GeneraRon  GC) 22 Young   Old   Eden   To   From   Survivor  Spaces   1 1 1
  23. 23. Minor  GC  (Young  GeneraRon  GC) 23 ! Young   Old   Eden   To   From   Survivor  Spaces   ! ! ! ! ! ! ! 1 ! 1 1   1  
  24. 24. Minor  GC  (Young  GeneraRon  GC) 24 Young   Old   Eden   To   From   Survivor  Spaces   1   2   1   2  
  25. 25. Minor  GC  (Young  GeneraRon  GC) 25 Young   Old   Eden   From   To   Survivor  Spaces   1   2   1   2  
  26. 26. Minor  GC  (Young  GeneraRon  GC) 26 Young   Old   Eden   From   To   Survivor  Spaces   16   1   16   2   ! ! ! ! ! ! ! ! 16   16   Promo
  27. 27. Minor  GC  (Young  GeneraRon  GC) 27 Young   Old   Eden   To   From   Survivor  Spaces   17   17   1 2 1 3  
  28. 28. Major  GC  (Old  GeneraRon  GC,  Full  GC) 28 Young   Old   Eden   To   From   Survivor  Spaces  
  29. 29. Major  GC  (Old  GeneraRon  GC,  Full  GC) 29 Young   Old   Eden   To   From   Survivor  Spaces   ! ! !! !
  30. 30. Major  GC  (Old  GeneraRon  GC,  Full  GC) 30 Young   Old   Eden   To   From   Survivor  Spaces   Compact
  31. 31. Tuning  Guideline •  讓  heap  的 size  足以容納程式的一般運作   •  Major  GC  通常會比  Minor  GC  花更多的時間 •  盡可能減少  Major  GC  的次數   31
  32. 32. HOTSPOT  GC  TUNING 32
  33. 33. 33 花太多時間做 GC → Performance變慢 Performance變慢→花太多時間做 GC 不一定!!!
  34. 34. Performance  Tuning  Methodology 34 Advanced  JVM  Tuning;  Java  One  2011;  David  Keenan,  Monica  Beckwith  
  35. 35. GC  Logging  in  ProducRon •  Don’t  be  afraid  to  enable  GC  logging  in   producRon   – Very  helpful  when  diagnosing  producRon  issues   •  Extremely  low  /  non-­‐existent  overhead   – Maybe  some  large  files  in  your  file  system.   – We  are  surprised  that  customers  are  sRll  afraid  to   enable  it   35
  36. 36. 36 If  Someone  doesn’t  enable     GC  logging  in  producEon   I  shoot  them!  
  37. 37. Most  Important  GC  Logging   Parameters •  You  need  at  least:   –  -­‐XX:+PrintGCDetails   –  -­‐XX:+PrintGCTimeStamps   •  Add  -­‐XX:+PrintGCDateStamps  if  you  must  know  the  Rme   •  Also  useful   –  -­‐Xloggc:file   –  Rotate  GC  Log,  Aqer  Java  1.6_34  (or  1.7_2):   -­‐XX:+UseGCLogFileRotaRon     -­‐XX:NumberOfGCLogFiles=5     -­‐XX:GCLogFileSize=10M   37
  38. 38. GCViewer  –  Offline  analysis  of  GC  logs   h[ps://github.com/chewiebug/GCViewer 38
  39. 39. GCViewer  –  Memory  Leak  Pa[ern   39
  40. 40. Footprint   (Heap  Size) Latencies Throughput
  41. 41. Footprint   (Heap  Size) Latencies Throughput
  42. 42. Hotspot  Tuning  -­‐  Sizing  Heap •  Young  GeneraRon  size  determines   •  Frequency  of  minor  GC     •  Number  of  objects  reclaimed  in  minor  GC   •  Old  GeneraRon  Size   •  Should  hold  applicaRon's  steady-­‐state  live  data  size   •  Try  to  minimize  frequency  of  major  GC’s   •  JVM  footprint  should  not  exceed  physical   memory   •  Max  of  80-­‐90%  RAM  (leave  room  for  OS)   •  Thumb  Rule:  Try  to  maximize  objects  reclaimed   in  young  gen.  Minimize  Full  GC  frequency   42
  43. 43. Calculate Live Data Size (LDS) •  經過 full  GC  後,  所剩下的  heap  size   •  Make  sure  you  get  full  GCs  during  steady-­‐state   •  Induce  a  couple  if  necessary   – JConsole  /  VisualVM   – jmap  -­‐histo:live  pid   – System.gc   •  Remove  it  before  deployment.  :-­‐) 43
  44. 44. Calculate  Live  Data  Size •  GC  log  example:   44
  45. 45. Calculate  Live  Data  Size  by  GCViewer 45
  46. 46. IniRal  Heap  ConfiguraRon •  Rule  of  thumb   – Set  -­‐Xms  and  -­‐Xmx  to  3x  to  4x  LDS   – Set  both  -­‐XX:PermSize  and  -­‐XX:MaxPermSize  to   around  1.2x  to  1.5x  the  max  perm  gen  size   – Set  the  generaRon  sizes  accordingly   •  Young  gen  should  be  around  1x  to  1.5x  LDS   •  Old  gen  should  be  around  2x  to  3x  LDS   •  e.g.,  young  gen  should  be  around  1/3-­‐1/4  of  the  heap   size   46
  47. 47. Hotspot  JVM  Heap  Layout 47 Young  –Xmn768m   Old  (Tenured)   Permanent   NaRve   -­‐Xms2g  –Xmx2g   -­‐XX:PermSize   -­‐XX:MaxPermSize   For  LDS  of  512m  :  -­‐Xmn768m  -­‐Xms2g  -­‐Xmx2g  
  48. 48. 48 Footprint   (Heap  Size) Latencies Throughput
  49. 49. High  Throughput  vs.  Low  Latency 49 High  Throughput   Low  Latency     App Thread GC Thread 專心 分心 較低 較高 較長 較短 Stop the world Total Cost
  50. 50. High  Throughput  vs.  Low  Latency •  For  most  applicaRons,  GC  overhead  is  small   –  2%  –  5%   •  High  Throughput  GCs   –  Move  most  work  to  GC  pauses   –  ApplicaRon  threads  do  as  li[le  as  possible   –  Least  overall  GC  overhead   •  Low  Latency  (Pause)  GCs   –  Move  work  out  of  GC  pauses   –  ApplicaRon  threads  do  more  work   •  Bookkeeping  for  GC  more  expensive   –  More  overall  GC  overhead   50
  51. 51. ApplicaRon  Requirement •  Different  applicaRons  have  different   requirements   – Higher  Throughput:   •  Batch  processing   •  Web  applicaRon:  pauses  during  garbage  collecRon  may   be  tolerable,  or  simply  obscured  by  network  latencies     – Lower  Latencies:   •  InteracRve  graphics  applicaRon   51
  52. 52. HotSpot  Garbage  Collectors  in  Java  SE  6 52 G1   -XX:+UseSerialGC -XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC -XX:+UseParallelGC -­‐XX:+UseParNewGC
  53. 53. HotSpot  Garbage  Collectors  in  Java  SE  6 53 G1   -XX:+UseSerialGC -XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC -XX:+UseParallelGC -­‐XX:+UseParNewGC
  54. 54. Serial  Collector 54 App Thread GC Thread stop-­‐the-­‐world   pause   Serial   Collector  
  55. 55. HotSpot  Garbage  Collectors  in  Java  SE  6 55 G1   -XX:+UseSerialGC -XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC -XX:+UseParallelGC -­‐XX:+UseParNewGC
  56. 56. Serial  VS  Parallel  Collector 56 App Thread GC Thread stop-­‐the-­‐world   pause   Serial   Collector   Parallel   Collector  
  57. 57. HotSpot  Garbage  Collectors  in  Java  SE  6 57 G1   -XX:+UseSerialGC -XX:+UseConcMarkSweepGC -XX:+UseParallelOldGC -XX:+UseParallelGC -­‐XX:+UseParNewGC
  58. 58. CMS  Collector 58 App Thread GC Thread iniRal  mark   concurrent   marking   remark   concurrent  sweeping  
  59. 59. CMS  Collector  with  ParNewGC 59 App Thread GC Thread
  60. 60. GC  SuggesRons 60 Low  Latency  Collectors   Throughput  Collectors  GeneraRon   Young   Old   2+  CPUs   -XX:+UseParNewGC 2+  CPUs   -XX:+UseParallelGC -XX: +UseConcMarkSweepGC -XX:+UseParallelOldGC New  G1  Collector  as  of  WLS10.3.1/JDK  6  Update  14  
  61. 61. NEXT  GENERATION  GC
  62. 62. Problems  of  Current  GC •  Memory  is  cheaper  and  cheaper   •  64  bits  JVM   •  We  can  use  very  large  heap! Young   Old   How  to  handle  large  heap  size?
  63. 63. G1  Collector •  The  Garbage-­‐First  Collector   –  Since  JDK  6u14,  officially  supported  as  of  JDK  7u4   –  -­‐XX:+UseG1GC   –  Future  CMS  Replacement   –  Server  “Style”  low  latency  collector   •  Parallel   •  Concurrent   –  GeneraRonal   –  Good  Throughput   –  CompacRng   –  Improved  ease-­‐of-­‐use   –  Predictable  (Soq  Real-­‐Time)   63
  64. 64. G1  –  Heap  Layout 64 S S Old Eden S Survivor Free Region Type
  65. 65. CMS  vs  G1  Collectors 65 •   Heap  split  into  regions     •   Young  generaRon  (A  set  of  regions)   •   Old  generaRon  (A  set  of  regions)  
  66. 66. G1  Collector:     Parallelism    Concurrency 66 App Thread GC Thread
  67. 67. GC  Comparison 67
  68. 68. GC  Comparison 68
  69. 69. GC  Comparison 69
  70. 70. GC  Comparison 70 h[p://blog.mgm-­‐tp.com/2013/03/garbage-­‐collecRon-­‐tuning/
  71. 71. 什麼時候該使用G1? •  Large  heaps   – Typically  ~6GB  or  larger  heaps   •  ApplicaRons  that  needs  low  pauses   71
  72. 72. 什麼時候不該使用 G1? •  G1需要更多的compuRng  resources和 memory  來運行   •  No  large  heaps   – Typically  smaller  than  6GB   •  ApplicaRons  that  don’t  need  low  pauses     72
  73. 73. SUMMARIZE
  74. 74. Summarize •  Professional  developer  必須非常了解   variables,  objects  的  life  cycle,  objects  何時有 資格被會收   •  GC  will  hurt  system  performance   •  Must  monitor  GC  acRviRes   •  Must  enable  GC  logging  
  75. 75. Tuning  Procedures •  Observer  LDS  to  decide  iniRal  size  se~ng   •  Use  parallel  GC  first   •  If  the  GC  pause  Rme  can’t  be  accepted,  then   trying  to  use  CMS   •  If  heap  is  over  6G,  and  look  for  lower  down   pause  Rme,  you  can  consider  G1   •  Monitoring  -­‐  Analyzing  -­‐  Tuning  -­‐   Monitoring  -­‐  … 75
  76. 76. REFERENCES 76
  77. 77. References •  Step-­‐by-­‐Step:  Garbage  CollecRon  Tuning  in  the   Java  HotSpot™  Virtual  Machine  –  JavaOne  2010   •  The  Garbage  CollecRon  Mythbusters  –  JavaOne   2010   •  GC  Tuning  for  the  HotSpot  JVM  –  JavaOne  2009   •  uPortal  Performance  OpRmizaRon.  Faizan   Ahmed.  Architect  and  Engineering  Group.   Enterprise  Systems    Services.  RUTGERS.   faizan@rutgers.edu.   •  h[p://java.sun.com/javase/technologies/hotspot/gc/ gc_tuning_6.html  
  78. 78. •  Java  Performance  –     Charlie  Hunt,  Binu  John     •  HotSpot  GC  Tuning  Guide     for  Java  SE  6   h[p://www.oracle.com/technetwork/java/javase/gc-­‐ tuning-­‐6-­‐140523.html   •  Memory  Management  in  the   Java  HotSpot  VM   h[p://www.oracle.com/technetwork/java/javase/ memorymanagement-­‐whitepaper-­‐150215.pdf   •  Java  6  Performance  Whitepaper   h]p://java.sun.com/performance/reference/whitepapers/6_performance.html   78
  79. 79. QA 79
  80. 80. Parallel   Concurrent   (CMS)   G1  

×