延迟指服务器处理一个请求所花费的时间,单位一般是ms、s。

本文主要讲降低延迟可以做的服务器端JVM优化。

JVM延迟优化

新生代

新生代大小决定了应用平均延迟

如果平均Minor GC持续时间大于应用程序平均延迟性要求,可以适当减小新生代空间大小;

如果Minor GC频率大于应用程序平均延迟性要求,可以适当增大新生代空间;

老年代

老年代大小决定了应用最差延迟

FullGC频率大于应用程序最大FullGC频率要求,可以适当增大老年代空间大小;

FullGC持续时间大于应用程序最差延迟性要求,可以使用CMS垃圾收集器;

CMS收集器调优

CMS主要特性

CMS为老年代收集器,收集线程能与应用程序线程实现最大的并行度,降低了延迟。

CMS并不进行压缩,所以老年代使用空闲列表分配内存,在一定程度上增加了新生代晋升老年代时,耗费的时间。

但一旦老年代溢出就会触发Stop-The-World压缩式垃圾收集。

所以,CMS的优化大概有下面几点:

1. 避免用尽老年代空间;

2. 解决老年代碎片化问题,解决方法包括压缩、MinorGC回收原则;

3. 降低初始标记阶段和重新标记阶段占用的时间,因为这两个阶段应用程序线程会被阻塞;

Survivor空间调优

调整Survivor空间,是为了让其有足够空间容纳存活对象足够长的时间,直到几个周期后对象老化,解决上面的第一、二条问题。

Survivor空间的大小可以通过下面这个参数调整:

-XX:SurvivorRatio=<ratio>

<ratio>必须大于0,-XX:SurvivorRatio=<ratio>表示单个Survivor和Eden的比率。

survivor空间大小  = –Xmn/(-XX:SurvivorRatio=<ratio> + 2)

监控晋升阈值

-XX:MaxTenuringThreshold=n     //设置最大晋升阈值

-XX:+PrintTenuringDistribution   //打印晋升的分布或对象年龄分布到GC日志

如下面这个晋升日志:

Desired survivor size 1114112 bytes, new threshold 1 (max 6)
- age 1: 2213864 bytes, 2213864 total

Desired survivor size 1114112 bytes是Survivor空间大小 * 目标存活率(可以设定,默认50%)

new threshold 1 JVM内部计算出的晋升阈值 (max 6)设置的晋升阈值

age   1(对象年龄代)   2213864 bytes(这个年龄对象总大小),    2213864 total(所有年龄对象总大小)

Survivor目标存活率:指Minor GC后Survivor空间占用比率,如果太大,下次Minor GC后存活的对象就有可能放不下

从这个日志可以看出,存活对象2213864bytes大于期望Survivor大小为1124112bytes,所以对象年龄为1时,就提升到了老年代。

解决这个问题的方法就是增大Survivor空间,存活对象大小 / 目标存活率 = Survivor空间大小,本例中大概4.5M,所以修改JVM参数为:

-Xmx512m -Xms512m -Xmn50m -XX:SurvivorRatio=5

调整后的晋升日志大概如下,这个已不是上面那个应用了,所以Survivor空间不一样,能说明问题就行:

Desired survivor size 87359488 bytes, new threshold 15 (max 15)
- age 1: 20701528 bytes, 20701528 total
- age 2: 4924656 bytes, 25626184 total
- age 3: 3261000 bytes, 28887184 total
- age 4: 7941120 bytes, 36828304 total

调整Survivor空间的一个重要原则:

调整Survivor空间时,应保持Eden空间不变,否则会导致Minor GC频率变小。

初始化CMS收集周期

CMS中发生的Stop-The-World压缩式垃圾收集可以在GC日志中查找并发模式失效(concurrent mode failure)定位。

如果有这个问题,就需要调整CMS收集周期。

-XX:CMSInitiatingOccupancyFraction=<percent>    //设置CMS垃圾收集周期在老年代空间占用达到多少是启动

-XX:+UseCMSInitiatingOccupancyOnly                  //告知JVM总是使用 CMSInitiatingOccupancyFraction比率启动CMS,否则只是在CMS第一次启动时

原则:CMSInitiatingOccupancyFraction设置的比率至少是老年代活跃数据的1.5倍

如果老年代空间消耗的比较慢,可以稍晚启动CMS,即将CMSInitiatingOccupancyFraction设定的更大;

如果老年代空间消耗的很快,可以将CMSInitiatingOccupancyFraction设定的更小,但不能低于活跃数据占用的比率;

降低CMS重新标记阶段占用时间

-XX:ParallelGCThreads   //控制重新标记的线程数,建议将CMS的收集线程数设置的小于默认值,否则大量GC线程会影响应用性能

-XX:+CMSScavengeBeforeRemark  //在CMS进入重新标记阶段先进行一次Minor GC,可以减少引用老年代的新生代对象数量,降低重新标记阶段的工作量

-XX:+ParallelRefProcEnabled    //使用多线程处理引用,不过在JDK6u25和6u26上有BUG

Java性能优化权威指南-读书笔记(四)-JVM性能调优-延迟的更多相关文章

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

    吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...

  2. Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述

    概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少.而是要根据实际的应用程序的系统需求,实际的活跃内存等确定.正文: JVM调优工作流程 整个调优过程是不断重复的一个迭代, ...

  3. Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具

    一:CPU 1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比. 系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比.系统态CPU高意味着共享资源有竞争或者I/O设备之间 ...

  4. Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用

    新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久代不满足内存分配请求时,发生Full ...

  5. [原创]Java性能优化权威指南读书思维导图

    [原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 ...

  6. [原创]Java性能优化权威指南读书思维导图4

    [原创]Java性能优化权威指南读书思维导图4

  7. [原创]Java性能优化权威指南读书思维导图3

    [原创]Java性能优化权威指南读书思维导图3

  8. [原创]Java性能优化权威指南读书思维导图2

    [原创]Java性能优化权威指南读书思维导图2

  9. 读书笔记系列之java性能优化权威指南 一 第一章

    主题:java性能优化权威指南 pdf 版本:英文版 Java Performance Tuning 忽略:(0~24页)Performance+Acknowledge 1.Strategies, A ...

随机推荐

  1. bzoj3555 企鹅QQ

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1640  Solved: 613 Description P ...

  2. FluentData,它是一个轻量级框架,关注性能和易用性。

    http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...

  3. Linux2.6内核实现的是NPTL

    NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M ...

  4. xss实例-什么都没过滤的情况

    1. XSS的存在,一定是伴随着输入,与输出2个概念的. 2. 要想过滤掉XSS,你可以在输入层面过滤,也可以在输出层面过滤. 3. 如果输入和输出都没过滤. 那么漏洞将是显而易见的. 4. 作为第一 ...

  5. 在.NET 环境中实现每日构建(Daily Build)--ccnet,MSBuild篇(转载)

    每日构建,对我们团队来说一个全新的概念.随着项目开发的进展,在开发过 程需要及时反馈一些BUG和功能要求的处理情况.而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以就特别有必 ...

  6. Hibernate unsaved-value 属性

    Session的saveOrUpdate方法是由Hibernate来判断被操作对象究竟是一个持久化对象还是临时自由状态对象.这需要在对象映射文件的主键id中定义unsaved-value属性,如果不显 ...

  7. HttpApplication的处理管道处理过程简单描述

    在asp.net中,asp.net服务器对每次请求的处理过程都是相同的,都要经过HttpApplication的处理管道.管道内的处理过程是固定的,在服务器处理请求的各个阶段,伴随着处理的进行,依次触 ...

  8. UVa12726 one Friend at a Time (位 广搜)

    题目链接:UVa12726 是个PDF,不好复制进来. 大意:有个人要追个妹子,想加妹子QQ,但是不知道谁规定的,玩QQ的人要加好友必须先要有至少k个共同好友.共有N个人玩QQ,编号为1到N,1是男主 ...

  9. jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API

    之所以把这部分放在这里,是因为这里用到了一些基本API,前一篇介绍过后才能使用. //jQuery通过find方法调用Sizzle引擎 //jQuery通过find方法调用Sizzle引擎 jQuer ...

  10. Entity Framework CodeFirst尝试

    前言 Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后 ...