实战HotSpot JVM GC

3,181 views

Published on

针对HotSpot JVM GC相关的内容,包括JVM内存划分、JVM分析相关工具、命令行常用参数、HotSpot GC策略、优化案例分析和优化建议等。

1 Comment
16 Likes
Statistics
Notes
No Downloads
Views
Total views
3,181
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
154
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide

实战HotSpot JVM GC

  1. 1. DigitalSonic 2012-04
  2. 2.  Load CPU MEM IO 响应时间 吞吐量 JVM——YGC、FGC次数与时间 ……
  3. 3.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  4. 4. 局部变量区 本地方法栈 PC寄 操作数栈 存器 栈帧 JVM方法区 JVM方法栈 JVM堆 PC寄存器 栈:JVM方法栈、本地方法栈 JVM方法区 JVM堆
  5. 5.  新生代Young/New (Eden, S0, S1) 旧生代Tenured 持久代Perm
  6. 6.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  7. 7.  jps jinfo JConsole VisualVM ( http://visualvm.java.net/ ) jstat ( http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html )
  8. 8.  jstat <选项> <pid> [间隔时间 ] [总次数] -gccapacity -gccause -gcutil pid not found怎么办?(/tmp/hsperfdata_用户名/vmid)
  9. 9.  kill -3 jstack jmap ( http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html ) Eclipse MAT ( http://www.eclipse.org/mat/ )
  10. 10.  dump 分析
  11. 11.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  12. 12.  -server 堆相关  -Xms -Xmx  -Xmn  -XX:PermSize -XX:MaxPermSize JMX相关  -Dcom.sun.management.jmxremote.port=9981  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false
  13. 13.  GC监控相关  -Xloggc: 文件  -XX:+PrintGCDetails  -XX:+PrintGCTimeStamps  -XX:+PrintGCDateStamps(jdk6u4) -XX:+PrintFlagsFinal(jdk6u21) -XX:-PrintCommandLineFlags
  14. 14.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  15. 15.  Minor GC  Serial Copying  ParNew  Parallel Scavenge Major GC  Serial  Parallel  CMS
  16. 16.  Serial Copying  -XX:+UseSerialGC  Client模式默认
  17. 17.  Parallel Scavenge  -XX:+UseParallelGC  -XX:-UseAdaptiveSizePolicy  -XX:ParallelGCThreads  Server模式默认
  18. 18.  ParNew  -XX:+UseParNewGC  CMS默认,针对CMS做了特殊处理  不可与并行旧生代GC共用
  19. 19.  Serial  Mark-Sweep-Compact  -XX:+UseSerialGC Parallel  Mark-(Summary)-Compact  -XX:+UseParallelOldGC
  20. 20.  Concurrent Mark-Sweep(CMS) 并行?并发?
  21. 21.  CMS  -XX:+UseConcMarkSweepGC  -XX:+CMSClassUnloadingEnabled  -XX:+UseCMSInitiatingOccupancyOnly  -XX:CMSInitiatingOccupancyFraction=68(5.0) /92(6.0)  -XX:+UseCMSCompactAtFullCollection  -XX:CMSFullGCsBeforeCompaction=0  -XX:+CMSParallelRemarkEnabled  -XX:+CMSMaxAbortablePrecleanTime=5000  -XX:ParallelCMSThreads
  22. 22.  CMS时有两种情况需要关注 promotion failed  Minor GC时Survivor放不下,旧生代也放不下 concurrent mode failure  CMS过程中有对象要放入旧生代,但空间不足 需要根据情况调整各区比例
  23. 23.  触发条件:  旧生代空间不足  PermGen空间不足  promotion failed / concurrent mode failure  统计到MinorGC平均晋升大小大于旧生代剩余空间
  24. 24.  GC监控相关(续)  -XX:+PrintTenuringDistribution  -XX:+PrintGCApplicationStoppedTime  -XX:+TraceClassLoading  -XX:+TraceClassUnloading Dump  -XX:+HeapDumpOnOutOfMemoryError(jdk5u7)  -XX:+HeapDumpOnCtrlBreak(jdk5u14)  -XX:+HeapDumpBeforeFullGC  -XX:HeapDumpPath=路径
  25. 25.  -XX:+PrintTenuringDistribution -XX:+TraceClassLoading
  26. 26.  GC对象晋升相关  -XX:SurvivorRatio  -XX:PretenureSizeThreshold=0  -XX:InitialTenuringThreshold=7  -XX:MaxTenuringThreshold=15  -XX:-UseAdaptiveSizePolicy -XX:+DisableExplicitGC -XX:ErrorFile=./hs_err_pid<pid>.log(jdk6)
  27. 27.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  28. 28.  开始前  基线数据收集  设定目标 进行中  修改配臵  数据对比 结束后  单机配臵  集群配臵  总结
  29. 29.  案例1:堆大小配臵造成GC频繁  -Xms768m -Xmx1280m -Xmn128m  -XX:PermSize=96m -XX:MaxPermSize=128m  -XX:SurvivorRatio=20000  -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
  30. 30.  问题  应该避免堆大小缩放  堆大小偏小  新生代过小  不该取消Survivor区 调整  -Xms1600m -Xmx1600m -Xmn600m  -XX:PermSize=128m -XX:MaxPermSize=128m  -XX:SurvivorRatio=22 -XX:MaxTenuringThreshold=6  -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
  31. 31. 旧参数GC情况120 采样间隔5秒钟10080 约35秒执行一次YGC60 约35秒执行一次FGC4020 0 41 73 77 81 5 33 9 37 57 65 93 69 97 53 61 1 25 85 29 21 45 13 49 89 17 S0 S1 E O P 新参数GC情况 120 采样间隔5秒钟 100 约140秒执行一次YGC 80 几乎没有FGC 60 GC耗时减少96% 40 20 0 81 93 33 37 41 61 65 69 73 77 97 5 53 9 57 1 25 45 29 21 85 89 13 17 49 S0 S1 E O P
  32. 32.  案例2:concurrent mode failure  -Xmx1280m -Xmn128m  存在一个尾递归,遇到大请求不断创建对象  症状:CPU飙高,系统无响应 调整:  -Xmx1800,调整堆大小,让系统完成调用,回 收资源  根本办法,去掉尾递归
  33. 33.  情况模拟  递归  循环
  34. 34. java -Xmx105m -Xms105m -Xmn30m -XX:SurvivorRatio=20000 -XX:MaxTenuringThreshold=0-XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStampsConcurrentModeFailure 递归 循环
  35. 35.  案例3:YGC造成Full GC频繁  JDK5  -Xms1800m -Xmx1800m -Xmn680m  -XX:PermSize=240m -XX:MaxPermSize=240m  -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 注意各区占用比例
  36. 36.  问题  存在concurrent mode failure  几乎每次YGC都会触发一次FGC 调整  -XX:+HandlePromotionFailure  -XX:PermSize=128m -XX:MaxPermSize=128m  -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSInitiatingOccupancyOnly  -XX:CMSInitiatingOccupancyFraction=65  -XX:SurvivorRatio=8
  37. 37.  效果  统计范围,一天  调整前 ▪ YGC 1177次,总耗时44.65秒 ▪ FGC 2177次,总耗时820.95秒  调整后 ▪ YGC 1359次,总耗时45.80秒 ▪ FGC 4次,总耗时0.41秒 ▪ GC总耗时缩短95%
  38. 38.  案例4:神出鬼没的System.gc()  代码中并未出现System.gc()的调用  有可能是依赖的库在调用System.gc()  调整:-XX:+DisableExplicitGC
  39. 39.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  40. 40.  堆大小  32位,最大内存4G,堆的大小不要超过2G 推荐比例  新生代大小最好是最大堆大小的3/8  Survivor比例适中 避免promotion failed和concurrent mode failure  此时会采用串行GC  调整各区比例,CMSInitiatingOccupancyFraction
  41. 41.  使用较新版本的JDK 使用较新版本的OS(至少要打补丁) 输出必要的性能日志 环境变化时,检查JVM参数是否依然合适
  42. 42. 参数 说明-XX:+HandlePromotionFailure 5.0默认false;6.0默认true-XX:+UseSplitVerifier 5.0默认false;6.0默认true-XX:+FailOverToOldVerifier 6.0引入-XX:+UseBiasedLocking 5.0u6引入,默认false;6.0默认true-XX:+UseSpinning 5.0默认false;6.0默认true-XX:PreBlockSpin=10-XX:+AggressiveOpts 5.0u6引入,默认false;6.0默认true-XX:+UseLargePages 5.0u5引入,默认false;6.0默认true-XX:LargePageSizeInBytes=4m-XX:+UseCompressedStrings 6.0u21,默认true-XX:+OptimizeStringConcat 6.0u20,默认true
  43. 43.  JVM内存划分 JVM分析相关工具 命令行常用参数 HotSpot GC策略 优化案例分析 优化建议 其他
  44. 44.  Garbage First  目标:尽量减少GC导致的应用暂停时间,同时 保持堆空间的利用率  分代,将堆分成多个固定大小的Region  始终执行Compact,消除碎片  回收时估算回收成本和价值,价值大的先回收  -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC  -XX:MaxGCPauseMillis =50  -XX:GCPauseIntervalMillis =200
  45. 45.  步骤  初始标记(Initial Marking)  并发标记(Concurrent Marking)  最终标记(Final Marking)  筛选回收(Live Data Counting and Evacuation)
  46. 46.  Oracle JRockit  分代堆  连续堆  Mostly Concurrent Mark and Sweep ▪ Sweep阶段分两次执行,一次清除一半,两次小暂停
  47. 47.  IBM JVM  分代堆  连续堆
  48. 48.  Oracle/Sun  http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp- 140102.html  http://www.oracle.com/technetwork/java/tuning-139912.html  http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html  http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html  https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs  http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp- 135488.html  http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garb age_collect.html http://blog.dynatrace.com/2011/05/11/how-garbage-collection-differs-in- the-three-big-jvms/ 感谢Bluedavy与RednaxelaFX

×