7. JVM性能调优入门
- 基本原则
- Minor GC回收原则,尽量多的收集垃圾
- GC内存最大化原则,堆越大越好
- GC调优3选2原则,吞吐量、延迟、内存占用
关注吞吐量和延迟的Java应用程序,都应该将-Xms和-Xms设定为同一个值,由于不管扩展仍是缩减新生代或者老年代的空间,都须要full gc,而full gc会下降程序的吞吐量并致使更长的延迟。一样须要将-XX: PermSize和-XX:MaxPermSize设置为同一个值。web
//打印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的性能