Sun jdk 1.6内存管理 -调优篇-毕玄

1,028 views

Published on

Published in: Technology, Spiritual
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,028
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Sun jdk 1.6内存管理 -调优篇-毕玄

  1. 1. Sun JDK 1.6 内存管理 调优篇 毕玄 2010-10、2010-11
  2. 2. 目标• 掌握一些GC调优的基本技巧和模式• 如何编写对GC友好的代码
  3. 3. Steps Measure Tuning Set Goal
  4. 4. Measure - Factors• GC Factors – Footprint/Allocate Rate/LDS/Pause Time/Throughput• APP Factors – Response Time/QPS• System Factors – Load/CPU/IO
  5. 5. Measure - Tools• GC Log• jstat• jmap• sar• top• Case Show!
  6. 6. GC Myth来源于JavaOne2010 The Garbage Collector Mythbusters Session
  7. 7. Tuning GoalThroughput Latency
  8. 8. JVM Choice• 32 bit – 在linux上有3G地址空间的限制; – 通常而言分配给JVM堆最好控制在2G以下;• 64 bit – pointer占用内存更多 • 最好开启-XX:+UseCompressedOOPS – 如机器内存和CPU都满足的情况下,64 bit is the better choice。
  9. 9. GC Choice• Throughput more important – ParallelOldGC• Latencies more important – Usually ParallelOldGC first,if not satisfied then CMS.
  10. 10. Footprint• Heap Size Starting Point• Calculate Live Data Size – Set –Xms,-Xmx to 3x to 4x LDS
  11. 11. Patterns• Goal: 降低FGC执行的频率• 可选方案 – 增大old; • 在不放大heap的情况下,可能会造成一些问题; • 放大heap; – 尽可能减少从new晋升到old的对象; • Tenuring Threshold、Survivor Space Size; – 优化系统性能。• Case Show!
  12. 12. Patterns• Goal: 降低FGC执行的频率 – 我们的case • ItemDetail • TC • promotioncenter
  13. 13. Patterns• Goal: 减小FGC造成的暂停时间• 可选方案 – 减小Heap; – GC换为CMS; – 升级或增加CPU。• Case Show!
  14. 14. Patterns• Goal: 减小FGC造成的暂停时间 – 我们的case • htcvstore • TM on 64 bit
  15. 15. Patterns• Goal: 降低YGC的执行频率• 可选方案 – 增大新生代; • 有可能造成FGC频繁。 – 优化系统性能。
  16. 16. Patterns• Goal: 缩短YGC造成的暂停时间• 可选方案 – 减小新生代; • 有可能会造成new晋升到old的对象增加; – 增加或升级CPU。
  17. 17. Experiences• ParallelOldGC Tuning – 根据应用决定是否要启用AdaptiveSizePolicy – Use NUMA
  18. 18. Experiences• CMS GC Tuning – Tenuring Threshold Tuning • MTT越大,晋升到old的对象可能越少,同时可能会导致 YGC耗时变长; • MTT越小,晋升到old的对象可能越多,同时可能会使得 YGC耗时变短,但也就造成了old的GC更频繁,对于CMS 而言,还会造成更多的内存碎片。 • Best behavior: bytes surviving per age decrease as age increases. – Survivor Size Tuning • 当太多对象晋升到Old时,可能会造成YGC耗时变长,此 时应考虑适当放大Survivor Size;
  19. 19. Experiences• CMS GC Tuning – 碎片监测 • -XX:PrintFLSStatiscis=2 –XX:+PrintCMSStatiscis – GC Cycle Initiation Tuning • LDS & allocate rate,不能太频繁,也不能太晚
  20. 20. Experiences• CMS GC Tuning – 最重要的 • 不要出现promotion failed和concurrent mode failure。 • promotion failed – 降低触发比率; – 增大survivor space或old; • concurrent mode failure – 降低触发比率; – 增大old;
  21. 21. Experiences• CMS GC Tuning – 不同case不同策略 • 如YGC后存活的对象较少,可以考虑调小survivor space以及tenuring threshold,以降低YGC的执行频率 和耗时; • 如YGC后存活的对象较多,则需要调小新生代,调大 Survivor Space,尽可能减少晋升到Old的对象,此时 如晋升的太多,则会出现YGC耗时比较长,且CMS GC频繁的现象。• Case Show!
  22. 22. 目标• 掌握一些GC调优的基本技巧和模式• 如何编写对GC友好的代码
  23. 23. Write GC-Friendly Code• 避免Autobox产生浪费;• 合理控制数据结构的大小,例如List、Map、 StringBuilder等;• 合理使用Reference;• 不要使用Finalizers来回收资源; – no guarantees when they will be run,or that they will not run at all.• 更好的处理read-only的数据。• Case Show!
  24. 24. 目标• 掌握一些GC调优的基本技巧和模式• 如何编写对GC友好的代码
  25. 25. References• <Step by step GC Tuning> by Tony• JDK 6 complete options

×