Java性能优化权威指南-读书笔记(四)-JVM性能调优-延迟
延迟指服务器处理一个请求所花费的时间,单位一般是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性能调优-延迟的更多相关文章
- Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量
吞吐量是指,应用程序的TPS: 每秒多少次事务,QPS: 每秒多少次查询等性能指标. 吞吐量调优就是减少垃圾收集器消耗的CPU周期数,从而将更多的CPU周期用于执行应用程序. CMS吞吐调优 CMS包 ...
- Java性能优化权威指南-读书笔记(二)-JVM性能调优-概述
概述:JVM性能调优没有一个非常固定的设置,比如堆大小设置多少,老年代设置多少.而是要根据实际的应用程序的系统需求,实际的活跃内存等确定.正文: JVM调优工作流程 整个调优过程是不断重复的一个迭代, ...
- Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具
一:CPU 1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比. 系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比.系统态CPU高意味着共享资源有竞争或者I/O设备之间 ...
- Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用
新生代.老年代.永久代的概念不多说,这三个空间中任何一个不能满足内存分配请求时,就会发生垃圾收集. 新生代不满足内存分配请求时,发生Minor GC,老年代.永久代不满足内存分配请求时,发生Full ...
- [原创]Java性能优化权威指南读书思维导图
[原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt Binu John 译者: 柳飞 ...
- [原创]Java性能优化权威指南读书思维导图4
[原创]Java性能优化权威指南读书思维导图4
- [原创]Java性能优化权威指南读书思维导图3
[原创]Java性能优化权威指南读书思维导图3
- [原创]Java性能优化权威指南读书思维导图2
[原创]Java性能优化权威指南读书思维导图2
- 读书笔记系列之java性能优化权威指南 一 第一章
主题:java性能优化权威指南 pdf 版本:英文版 Java Performance Tuning 忽略:(0~24页)Performance+Acknowledge 1.Strategies, A ...
随机推荐
- win10 1607 安装密钥 GVLK
Core=YTMG3-N6DKC-DKB77-7M9GH-8HVX7 Professional=VK7JG-NPHTM-C97JM-9MPGT-3V66T Enterprise=XGVPP-NMH47 ...
- Windows Server 2008 显示桌面图标
相信有朋友们有安装使用过windows 2008 server服务器,刚安装好的时候,桌面上只有一个回收站的图标,它没有像windows 7或windows 8一样可以直接通过右击鼠标的菜单来设置,要 ...
- ExtJS入门教程01,Window如此简单,你怎能不会?
这是一系列ExtJS教程,今天的是第一篇,主要介绍ExtJS中Window的基本用法.希望大家能够支持! 来吧,创建一个漂亮的弹出窗 var win = Ext.create("Ext.Wi ...
- MyEclipse------如何查询MySQL数据库里面表的信息
testExecuteQuary.jsp <%@ page language="java" import="java.util.*" pageEncodi ...
- php中单例模式的解析说明
<?php //单例模式 class Dbconn{ private static $_instance=null; protected static $_counter=0; protecte ...
- spring 注解简单使用
一.通用注解 1.项目结构: 2.新建Person类,注解@Component未指明id,则后期使用spring获取实例对象时使用默认id="person"方式获取或使用类方式获取 ...
- safeNet
把那4个dll丢到C:\Windows\SysWOW64里去重启IIS,再测试
- DROP TABLE ** CASCADE CONSTRAINTS PURGE删除表的时候级联删除从表外键
1.关于 cascade constraints 假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键). 则当删除A表时,如不特殊说明,则 drop table A 系统会出现错误 ...
- ASP.NTE 5 Target framework dnx451 and dnxcore50(转)原文:http://www.cnblogs.com/xishuai/p/aspnet5-target-framework-dnx451-and-dnxcore50.html
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NTE 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...
- jquery json ajax -2
如果使用的是虚拟空间, 那么你不能操纵/配置服务器上的php.ini配置文件 但是可以在自己的php文件中, 通过ini_set(...), 和一些对应的函数, 去重置(临时的,仅在当前文件中生效的) ...