调优延迟/响应性
评估垃圾收集器对延迟性影响的过程中将进行下面的活动:
1、测量Minor GC的持续时间
2、统计Minor GC的次数
3、测量Full GC的最差(最长)的持续时间
4、统计最差情况下,Full GC的频率
可能采取的活动包括:
1、堆分析,修改应用程序,减少对象分配及对象
2、改变JVM的部署模式,减少单个JVM负荷
优化新生代的大小
Minor GC 频率少,间隔时间长,修正的方法是减少新生代空间
频率高,修正的方法就是增加新生代空间
调整过程中,尽量保持年老代空间大小恒定
调整新生代的几个原则
1、老年代空间大小不应该小于活跃数据大小的1.5倍
2、新生代空间至少应为java堆大小的10%,通过-Xmx和-Xms可以设定改值
3、增大Java堆大小时,注意不要超过JVM可用的物理内存数
调整新生代也无法满足系统延迟则可以修改应用程序或者改变JVM的部署模式
如果仅仅通过监控Minor GC就能达到应用程序的延迟性要求,就可以直接进入到年老代空间的调整
优化老年代的大小
Full GC持续时间计算方法
1、可以直接通过每次Full GC的间隔获得
2、如果没有发生Full GC,可以通过多次Minor GC计算获得,根据每次Minor GC后,老年代提升的空间计算出每秒老年代提升的空间。再由老年代的总空间/老年代每秒提升的空间可以得到。
Survivor空间的大小可以通过 -xx:survivorRtio=<ratio> 表示单个survivor空间与Eden空间的大小的比率
survivor空间的大小=-Xmn<value>/(-xx:SurvivorRatio=<ratio>+2)
减少survivor的比率会增大Survivor空间,同时减少Eden空间,会导致更频繁的MinorGC。垃圾收集的频率越高,对象老化的速度越快
晋升阙值可通过-xx:maxTenuringThreshold=<n>
指定对象的年龄通过<n>值将其提升到年老代空间
内部计算出的晋升阙值不会超过最大晋升阙值
设定的值是CMS垃圾收集周期在年老代空间占用达到多少百分比时启用:-xx:CMSInititiatingOccupancyFraction=65
最好配合-xx:CMSInitiatingOccupanyOnly=<percent>同时使用
设定的值应该大于老年代占用空间和活跃数据的大小之比
例如
-Xmx1536m -Xms 1536m -Xmn 512m
-xx:CMSInitiatingOccupancyFraction=51
-xx:+useCMSInitiatingOccupancyOnly
永久代启动CMS -xx:CMSInitiatingPermOccupanyFraction=<percent>
-xx:+useCMSInitiatingOccupanyOnly
-xx:parallelGCthreads=<n> 重新标记的线程数