一、调优原则
根据硬件、需求选择不同收集器进行组合, 最终目的是减少STW
可组合的收集器
二、用到的参数
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParalledlOldGC:设置并行老年代收集器
-XX:+UseConcMarkSweepGC:设置CMS并发收集器
-XX:+UseG1GC:设置G1收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
并行收集器设置
-XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis:设置并行收集最大暂停时间
-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
CMS收集器设置
-XX:+UseConcMarkSweepGC:设置CMS并发收集器
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:UseCMSInitiatingOccupancyOnly:设置 CMS 收集器在老年代空间被使用多少后触发,默认为 68%
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction=75:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理,(PS
因为年老代的并发收集器使用标记,清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象.但是,当堆空间较小时,运行一段时间以后,就会出现"碎片",如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收.如果出现"碎片",可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
打开压缩 打开压缩后,多少次FullGC进行一次压缩
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
打开只要到达阈值才进行回收 设置的阈值
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80
)
G1收集器设置
-XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:指定GC工作的线程数量
-XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
-XX:GCTimeRatio:吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集
-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
-XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
-XX:G1MaxNewSizePercent:新生代内存最大空间
-XX:TargetSurvivorRatio:Survivor填充容量(默认50%)
-XX:MaxTenuringThreshold:最大任期阈值(默认15)
-XX:InitiatingHeapOccupancyPercen:老年代占用空间超过正对比IHOP阈值(默认45%),超过则执行混合收集
-XX:G1HeapWastePercent:堆废物百分比(默认5%)
-XX:G1MixedGCCountTarget:参数混合周期的最大总次数(默认8)
三、调优
第一组:Serail+SerailOld
设置-XX:+UseSerialGC
Jar包设置:-Xms1024M -Xmx1024M -XX:+PrintGCDetails -XX:+UseSerialGC-XX:ParallelGCThreads=1 -XX:+PrintGCTimeStamps -Xloggc:.
平均响应时间和吞吐量
结论:serail为单线程串行,在单CPU下使用效率高,减少CPU切换线程造成的性能浪费
第二组:ParNew+SerailOld
设置-XX:+UseParNewGC
Jar设置-Xms1024M -Xmx1024M -XX:+PrintGCDetails -XX:+UseParNewGC -XX:ParallelGCThreads=3 -XX:+PrintGCTimeStamps -Xloggc:.
-XX:ParallelGCThreads=1时
-XX:ParallelGCThreads=3时
不同线程数,输出的日志
结论:明显3个线程比1个线程垃圾收集速度快(线程个数设置=cpu个数)
第三组:ParallelGC+ParallelOldGC
设置-XX:+UseParallelOldGC
Jar包设置-Xms256M -Xmx256M -XX:+PrintGCDetails -XX:+UseParallelOldGC -XX:ParallelGCThreads=3 -XX:+PrintGCTimeStamps -XX:MaxGCPauseMillis=100 -XX:GCTimeRatio=9
-XX:ParallelGCThreads=1时
-XX:ParallelGCThreads=3时
一个线程
结论:这种设置主要是在老年代垃圾收集时增加并行收集,加快收集速度,减少stw时间
第四组:ParNew+CMS+SerailOld
设置-XX:+UseConcMarkSweepGC
Jar包设置-Xms1024M -Xmx1024M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=3 -XX:+PrintGCTimeStamps -XX:MaxGCPauseMillis=100 -XX:GCTimeRatio=9
平均响应时间和吞吐量