您的位置:首页 > 编程语言 > Java开发

《Java性能优化权威指南》读书笔记(二)

2016-07-04 11:19 387 查看
摘要: 第七章干货不少,为性能调优找到了理论依据

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的性能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: