《Java性能优化权威指南》读书笔记(二)
2016-07-04 11:19
387 查看
摘要: 第七章干货不少,为性能调优找到了理论依据
Minor GC回收原则,尽可能多的收集垃圾
GC内存最大化原则,堆越大越好
GC调优3选2原则,吞吐量、延迟、内存占用
关注吞吐量和延迟的Java应用程序,都应该将-Xms和-Xms设定为同一个值,因为无论扩展还是缩减新生代或者老年代的空间,都需要full gc,而full gc会降低程序的吞吐量并导致更长的延迟。同样需要将-XX: PermSize和-XX:MaxPermSize设置为同一个值。
计算活跃数据
多次Full GC数据,之后,取平均值计算
命令行触发full gc:jmap -histo:live <pid>
通用配置
-Xms和-Xmx设置为老年代活跃数据的3~4倍
-XX: PermSize和-XX:MaxPermSize设置为永久代活跃数据的1.2~1.5倍
新生代为老年代活跃数据的1~1.5倍
优化新生代
新生代越小,minor gc时间越短,频率越高
老年代大小不小于活跃数据的1.5倍
新生代至少为堆的10%
增加堆,但是要注意物理内存
优化老年代
Java堆总大小-新生代=老年代大小
老年代大小-老年代活跃数据=空闲空间
每次Minor GC后,老年代占用空间可以计算提升率
提升率/空闲空间=平均Full GC次数
CMS调优
如果老年代用尽,触发单线程的stop-the-world压缩式垃圾搜集
如果minor gc TO不足以容纳从Eden和From的对象,溢出到老年代,导致非计划的老年代消耗加速
单个survivor大小 = -Xmn / (-XX:Survivoration=<ratio> + 2)
解析晋升阈值
-XX:PrintTenuringDistribution
survivor空间大小小于总的存活对象大小,导致survivor空间溢出
对象年龄明显小于晋升阈值,表明survivor空间过小
cms默认使用50%的目标survivor空间,对象总大小/50%=单个survivor大小
这个50%是-XX:TargetSurvivoratio=<percent>配置的
gc日志中出现,concurrent mode failure,应该更早触发cms,设定老年代占用多少开始cms,两个命令同时使用
-XX:CMSInitiatingOccupancyFraction=<percent>
-XX:+UseCMSInitiatingOccupancyOnly
显示垃圾收集
-XX:+DisableExplicitGC,忽略System.gc()调用
Full GC(System)是由System.gc()调用引起的
永久带CMS
关键词:Full GC,CMS Perm
开启永久带回收,默认是不开启的:-XX:+CMSclassUnloadingEnable,-XX:+CMSPermgenSweepingEnable
也可以设置多少百分比启动回收
减少停顿时间
初始标记阶段一般不用管
重新标记,可以指定线程:-XX:ParallelGCThreads=<n>,默认值:8 + (Runtime.availableProcessors() - 8) * 5 / 8
CMS吞吐调优
指导原则:CMS包括Minor GC带来的开销应该小于10%,如果开销在3%或者更小,则调优提升有限
Throughtput吞吐调优
(忽略)
其他方法
实验性优化
逃逸分析
偏向锁
大页面支持,增加TLB的命中率
Solaris:pagesize -a
Linux:-XX:+UseLargePages,需要配合操作系统的修改
Windows:...
后面几章介绍基准测试,和具体某方面(如web、webService)的优化细节,直接忽略了。
Java应用的基准测试
多层应用的基准测试
Web应用的性能调优
WebService的性能
Java持久化及Enterprise Java Bean的性能
7. JVM性能调优入门
基本原则Minor GC回收原则,尽可能多的收集垃圾
GC内存最大化原则,堆越大越好
GC调优3选2原则,吞吐量、延迟、内存占用
关注吞吐量和延迟的Java应用程序,都应该将-Xms和-Xms设定为同一个值,因为无论扩展还是缩减新生代或者老年代的空间,都需要full gc,而full gc会降低程序的吞吐量并导致更长的延迟。同样需要将-XX: PermSize和-XX:MaxPermSize设置为同一个值。
//打印GC日志参数: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:<filename> --------------- -XX:PrintGCDateStamps --------------- -XX:PrintGCApplicationStoppedTime -XX:PrintGCApplicationConcurrentTime -XX:PrintSafepointStatistics --------------- //新生代: -XX:NewSize=<n>,设定新生代初始值、最小值 -XX:MaxNewSize=<n>,设定新生代最大值 -Xms<n>,设定新生代初始值、最小值和最大值 --------------- //永久代: -XX:PermSize=<n> -XX:MaxPermSize=<n>
计算活跃数据
多次Full GC数据,之后,取平均值计算
命令行触发full gc:jmap -histo:live <pid>
通用配置
-Xms和-Xmx设置为老年代活跃数据的3~4倍
-XX: PermSize和-XX:MaxPermSize设置为永久代活跃数据的1.2~1.5倍
新生代为老年代活跃数据的1~1.5倍
优化新生代
新生代越小,minor gc时间越短,频率越高
老年代大小不小于活跃数据的1.5倍
新生代至少为堆的10%
增加堆,但是要注意物理内存
优化老年代
Java堆总大小-新生代=老年代大小
老年代大小-老年代活跃数据=空闲空间
每次Minor GC后,老年代占用空间可以计算提升率
提升率/空闲空间=平均Full GC次数
CMS调优
如果老年代用尽,触发单线程的stop-the-world压缩式垃圾搜集
如果minor gc TO不足以容纳从Eden和From的对象,溢出到老年代,导致非计划的老年代消耗加速
单个survivor大小 = -Xmn / (-XX:Survivoration=<ratio> + 2)
解析晋升阈值
-XX:PrintTenuringDistribution
survivor空间大小小于总的存活对象大小,导致survivor空间溢出
对象年龄明显小于晋升阈值,表明survivor空间过小
cms默认使用50%的目标survivor空间,对象总大小/50%=单个survivor大小
这个50%是-XX:TargetSurvivoratio=<percent>配置的
gc日志中出现,concurrent mode failure,应该更早触发cms,设定老年代占用多少开始cms,两个命令同时使用
-XX:CMSInitiatingOccupancyFraction=<percent>
-XX:+UseCMSInitiatingOccupancyOnly
显示垃圾收集
-XX:+DisableExplicitGC,忽略System.gc()调用
Full GC(System)是由System.gc()调用引起的
永久带CMS
关键词:Full GC,CMS Perm
开启永久带回收,默认是不开启的:-XX:+CMSclassUnloadingEnable,-XX:+CMSPermgenSweepingEnable
也可以设置多少百分比启动回收
减少停顿时间
初始标记阶段一般不用管
重新标记,可以指定线程:-XX:ParallelGCThreads=<n>,默认值:8 + (Runtime.availableProcessors() - 8) * 5 / 8
CMS吞吐调优
指导原则:CMS包括Minor GC带来的开销应该小于10%,如果开销在3%或者更小,则调优提升有限
Throughtput吞吐调优
(忽略)
其他方法
实验性优化
逃逸分析
偏向锁
大页面支持,增加TLB的命中率
Solaris:pagesize -a
Linux:-XX:+UseLargePages,需要配合操作系统的修改
Windows:...
后面几章介绍基准测试,和具体某方面(如web、webService)的优化细节,直接忽略了。
Java应用的基准测试
多层应用的基准测试
Web应用的性能调优
WebService的性能
Java持久化及Enterprise Java Bean的性能
相关文章推荐
- springMVC 返回中文字符串时乱码
- Eclipse 使用经验总结
- Android studio导入eclipse项目且不改变目录结构
- Myeclipse和IntelliJ IDEA的全局搜索及其他快捷键
- JDK、JRE、JVM三者间的关系
- JAVA调用SAP端RFC接口报java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path错误
- ZK framework on Java
- java加密之RSA加密
- Java位操作总结
- java中去除空格或者空白字符
- Myeclipse错误:Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project
- java可重入锁
- Java IO: System.in, System.out, System.err
- Java桥接模式(Bridge)-结构型
- AJAX编程技巧:在Struts Action中如何向客户端发送xml文件?
- myeclipse破解补丁激活失败方法
- springboot 使用心得
- Java IO:管道
- javaweb国际化
- 弄懂JDK、JRE和JVM到底是什么