• Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量


    吞吐量是指,应用程序的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 大页面支持
  • 相关阅读:
    Linux入门之系统启动
    2017.12.25 Android数据存储方案
    2017.12.18 Android开发之进程讲解
    2017.12.18 Android开发之消息队列(实现子线程修改UI组件)
    2017.12.4 Android开发之ListView组件
    2017.12.10 把KIE的jbpm_console嵌入到我们的web项目中
    2017.12.07 React组件嵌套以及for循环渲染子组件
    2017.12.07 React路由到不同组件界面
    2017.12.07 Ajax获取服务器数据并发送到前端
    B-树&B+树以及其在数据库中的应用
  • 原文地址:https://www.cnblogs.com/xiongpq/p/6160044.html
Copyright © 2020-2023  润新知