吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标。
吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序。
CMS吞吐调优
CMS包括Minor GC所带来的开销应该小于10%,如果垃圾收集的开销在3%或更少,说明通过调优吞吐量,提升性能的空间就极其有限了。
可用的调优方法如下:
1. 增大新生代空间,以降低Minor GC频率,减少CPU周期占用;
2. 增加老年代空间,以降低CMS频率,并可以减少老年代内存碎片;
3. 优化CMS周期的启动条件,尽可能在较晚的时候进行;
总的来说,就是减少垃圾收集占用的CPU周期。
ParallelGC吞吐调优
这里说的ParallelGC是指开启了下面两个JVM参数
-XX:+UseParallelGC
-XX:+UseParallelOldGC
对ParallelGC调优的目标是尽可能避免发生Full GC,这就需要优化对象老化频率,可以调整Survivor空间实现对对象老化的优化。
使用ParallelGC时,垃圾收集的开销应小于5%,如果已经减少到1%甚至更少,那基本上就已经达到了极限。
Survivor调优
ParallelGC默认可以自动调整Survivor空间,大部分应用用自动调整已经可以,对要求比较高的应用就需要关闭自动调整,进行手动调整。
为JVM添加下面两个参数,只针对ParallelGC有用:
-XX:-UseAdaptiveSizePolicy //关闭自适应调整 -XX:+PrintAdaptiveSizePolicy //打印详细Survivor空间占用日志
如下面日志:
2016-12-11T16:44:03.653+0800: 5.042: [GC (Allocation Failure) AdaptiveSizePolicy::update_averages: survived: 10464720 promoted: 1096456 overflow: true
survived:“TO”Survivor空间占用大小;
promoted: 新生代提升至老年代的对象大小;
overflow:是否有Survivor空间的对象溢出到老年代;
从上面的日志可以看出,Minor GC后新生代存活对象大小10M,因为没有设置-XX:TargetSurvivorRatio,默认Survivor空间占用比率为50%,
所以Survivor空间应为20M。
找到稳定态下Full GC之间所有Minor GC中最大的存活对象大小,然后就可以调整Survivor空间大小。
原JVM参数如下:
-Xmx1024m –Xms1024m –Xmn50m -XX:SurvivorRatio=3
可以计算出:原Survivor空间:10M,原Eden空间:30M
现在增大Survivor空间到20M
保证Eden空间不变,则新生代大小为70M;
70M / (SurvivorRatio + 2)=20M,所以SurvivorRatio=1.5
保证老年代空间不变,则Java堆大小调整为1044M
所以最后JVM参数为:
-Xmx1044m -Xms1044m -Xmn70m -XX:SurvivorRatio=1.5
如果Java堆大小已经不能再增大,可以计算下Minor GC后,存活对象的最小值、最大值、平均值,如果不存在大幅波动,
可以尝试提高Survivor空间的占用百分比-XX:TargetSurvivorRatio=<n>,其默认为50%。
并行线程调优
-XX:ParallelGCThreads
并行垃圾收集器的线程数,建议收集线程数设置的小于默认值,否则大量GC线程会影响应用性能
其他性能命令行选项
-XX:+AggressiveOpts | 自动优化,但有可能不太稳定 |
-XX:+DoEscapeAnalysis | 逃逸分析 |
-XX:+UseBiasedLocking | 偏向锁 |
-XX:+UseLargePages | 大页面支持 |