一、Throughput收集器(吞吐量)
-XX:+UseParallelGC
-XX:+UseParallelOldGC
*参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量
增强堆大小可以减少Full GC频率,但却会增加停顿时间
1.手动调整
-Xmn
-Xms
-XX:NewRatio=N
手动指定堆内存大小和代空间比例,一般要多次试验
2.自动参数调整
-XX:MaxGCPauseMillis=N 可接受最大停顿时间
-XX:GCTimeRatio=N 可接受GC时间占比(目标吞吐量) 吞吐量=1-1/(1+N)
步骤:
1.MaxGCPauseMillis优先级高,JVM会自动调整堆大小和代空间值,以期满足MaxGCPauseMillis
2.当MaxGCPauseMillis满足后,JVM会增大堆大小,直到满足GCTimeRatio
3.当MaxGCPauseMillis和GCTimeRadio都满足后,JVM会尽可能以最小堆大小来实现这两个指标参数
Throughput一般不考虑响应时间,所以一般不设置-XX:MaxGCPauseMillis
一般吞吐量在95%以上就算比较好的了,对于可用内存很少的环境可以降低指标
二、CMS收集器(响应时间)
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
CMS收集器会对年轻代进行并发GC, 会有stw(stop-the-world)
CMS收集器会对老年代进行并发GC, CMS
如果有必要,CMS会发起单线程的Full GC, 这个操作十分耗时
Full GC原因:
并发模式失效:新生代发生GC时,老年代没有足够内存容纳晋升对象
晋升失败:老年代虽然有足够容纳晋升对象的内存,但内存都是碎片,导致晋升失败
*参数调整:避免并发模式失效和晋升失败
-XX:+UseCMSInitiatingOccupancyOnly 根据Old内存使用阈值决定何时CMS, 默认是false,会用更复杂的算法决定何时CMS
-XX:CMSInitingOccupancyFraction=N default N=70,老年代内存使用70%时就发生CMS
N设置太大,容易并发模式失效;N太小,CMS过于频繁,而CMS也会导致stop-the-world
-XX:ConGCThreads=N GC的线程会100%占用CPU,如果发生并发模式失败,而N还小于CPU核心数,此时可以增加N。
如果没有发生并发模式失败,此时可以减少N,以让应用程序有更多CPU执行
Perm持久代GC调优
持久代内存满了会引发Full GC
持久代GC调优主要是让持久代也进行CMS收集
-XX:+CMSPermGenSweepingEnable 使持久代使用CMS收集器
-XX:+CMSClassUnloadingEnable 使持久代能真正释放不再被使用的类。默认是不会释放类的元数据的
增量式CMS:普通CMS线程会占用100%的cpu负载,增量式CMS会让出一定CPU负载给应用线程
这适合在单核CPU使用,显然已经没啥用处了