Serial 串行回收器
串行垃圾回收器,HotSpot客户端模式下默认的垃圾回收器
-XX:+UseSerialGC
指定年轻代和老年代都使用串行的垃圾回收器。等价于新生代用Serial GC老年代用Serial Old GC
ParNew 并行回收器
-XX:+UseParNewGC
手动指定使用ParNew收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代。
-XX:ParallelGCThreads=N
限制线程数量,默认开启和CPU数据相同的线程数。
Parallel回收器
XX:+UseParallelGC 手动指定年轻代使用Paralle1并行收集器执行内存回收任务。
-XX:+UseParallel0ldGC 手动指定老年代都是使用并行回收收集器。
分别适用于新生代和老年代。认jdk8是开启的。
上面两个参数,默认开启一个,另一个也会被开启。(互相激活)
-XX:ParallelGcThreads 设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能。
在默认情况下,当CPU 数量小于8个,ParallelGcThreads 的值等于CPU 数量。
当CPU数量大于8个,ParallelGcThreads 的值等于3+[5*CPU_Count]/8]。
-XX:MaxGCPauseMillis 设置垃圾收集器最大停顿时间(即STW的时间)。单位是毫秒。
为了尽可能地把停顿时间控制在MaxGCPauseMi11s以内,收集器在工作时会调整Java堆大小或者其他一些参数。
对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel(吞吐量),进行控制。该参数使用需谨慎。
-Xx:GCTimeRatio 垃圾收集时间占总时间的比例(=1/(N + 1))。用于衡量吞吐量的大小。
取值范围(0,100)。默认值99,也就是垃圾回收时间不超过1%。
与前一个-XX:MaxGcPauseMillis参数有一定矛盾性。暂停时间越长,Radio参数就容易超过设定的比例。
-XX:+UseAdaptivesizePolicy设置Parallel scavenge收集器具有自适应调节策略
CMS
XX:+UseConcMarksweepGC 手动指定使用CMS 收集器执行内存回收任务。
开启该参数后会自动将-xx:+UseParNewGc打开。即:ParNew(Young区用)+CMS(01d区用)+seria1 0ld的组合。
-XX:CMslnitiatingoccupanyFraction 设置堆内存使用率的值,一旦达到该值,便开始进行回收。
JDK5及以前版本的默认值为68,即当老年代的空间使用率达到68%时,会执行一次CMS 回收。JDK6及以上版本默认值为92%
如果内存增长缓慢,则可以设置一个稍大的值,大的值可以有效降低CMS的触发频率,减少老年代回收的次数可以较为明显地改善应用程序性能。反之,如果应用程序内存使用率增长很快,则应该降低这个阌值,以避免频繁触发老年代串行收集器。因此通过该选项便可以有效降低Fu11 GC 的执行次数。
-XX:+UsecMscompactAtFullcollection 用于指定在执行完Fu11 GC后对内存空间进行压缩整理以此避免内存碎片的产生。不过由于内存压缩整理过程无法并发执行,所带来的问题就是停顿时间变得更长了。
-XX:CMSFul1GCsBeforecompaction 设置在执行多少次Fu11 GC后对内存空间进行压缩整理。
-XX:ParallelcMsThreads 设置CMS的线程数。
CMS 默认启动的线程数是(ParallelGcThreads+3)/4,ParallelGcThreads 是年轻代并行收集器的线程数。当CPU 资源比较紧张时,受到CMS收集器线程的影响,应用程序的性能在垃圾回收阶段可能会非常糟糕
另外,CMS收集器还有如下常用参数:
-xx:concGcThreads:设置并发垃圾收集的线程数,默认该值是基于ParallelGcThreads计算出来的;
-XX:+UseCMSInitiatingoccupancyonly:是否动态可调,用这个参数可以使CMS一直按CMsInitiatingoccupancyFraction设定的值启动
-XX:+CMsScavengeBeforeRemark:强制hotspot虛拟机在cms remark阶段之前做一次minorgc,用于提高remark阶段的速变:
-XX:+cMsclassUnloadingEnable:如果有的话,启用回收Perm 区(JDK8之前)
-XX:+CMSParallelInitialEnabled:用于开启cMs initial-mark阶段采用多线程的方式进行标记,用于提高标记速度,在ava8开始已经默认开启;
-XX:+CMSParallelRemarkEnabled:用户开启CMs remark阶段采用多线程的方式进行重新标记默认开启;
-XX:+ExplicitGcInvokesconcurrent
-XX:+ExplicitGcInvokesconcurrentAndUnloadsclasses这两个参数用户指定hotspot虚拟在执行system.gc()时使用CMS周期;
-XX:+CMSPrecleaningEnabled:指定CMS是否需要进行Pre cleaning这个阶段
G1回收器
-XX:+UseG1GC
手动指定使用G1收集器执行内存回收任务。
-XX:G1HeapRegionsize
设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。
-XX:MaxGCPauseMillis
设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认值是200ms
-XX:ParallelGcThread
设置STW时GC线程数的值。最多设置为8
-XX:ConcGcThreads
设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGcThreads)的1/4左右。
-XX:InitiatingHeapOccupancyPercent设置触发并发GC周期的Java堆占用率值。超过此值,就触发GC。默认值是45。
-XX:G1NewSizePercent -XX:G1MaxNewSizePercent新生代占用整个堆内存的最小百分比(默认5%)、最大百分比(默认60%)
-XX:G1ReservePercent=10
保留内存区域,防止 to space(Survivor中的to区)溢出