一、并行垃圾收集器
1.Parallel Collector
-XX:+UseParallelGC 手动开启并行垃圾收集,Server模式默认开启
-XX:ParallelGCThreads=<N> 开启多少个线程并行收集垃圾
CPU>8 ,则N=5/8;(CPU为8,开启5个)
CPU<8,则N=CPU;
2.Parallel Collector Ergonomics
-XX:MaxGCPauseMillis=<N>响应时间
-XX:GCTimeRatio=<N> 吞吐量
-Xmx<N>最大最内存
可通过设置响应时间和吞吐量,让jvm自适应来调整堆的大小。
二、并发CMS
1.并发收集,低停顿,低延迟,老年代收集器
2.过程
CMS initail mark :初始标记Root,STW。需要暂停应用程序
CMS concurrent mark:并发标记,根节点往后的标记,不需要暂停应用程序
CMS concurrent preclean :并发预清理
CMS remark:重新标记,STW。
CMS concurent sweep:并发清理
CMS concurrent reset:并发重置
3.CMS缺点
cpu敏感,因为在执行垃圾收集的过程中也会执行应用程序,
浮动垃圾,因为在垃圾回收的时候,应用程序也在运行,会进行空间分配的
空间碎片,因为采用的算法是标记清除算法,所以会产生空间碎片。
4.参数
-XX:ConcGCThreads :并发的GC线程数
-XX:+UseCMSCompactAtFullCollection :fullGC之后进行空间压缩
-XX:CMSFullGCsBeforeCompaction:发生多少次fullGC之后做一次压缩
-XX:CMSInitiatingOccupancyFraction:存活对象占old区空间率多少的时候进行一次fullGC
-XX:+UseCMSInitiatingOccupancyOnly:表示触发FUllGC的条件是否是可动态调节的
-XX:+CMSScavengeBeforeRemark:在做fullGC之前是否执行一次mimorGC
-XX:+CMSClassUnloadingEnabled:是否启用回收Perm区(在jdk7之前)
5.iCMS
适用于单核或者双核(jdk8之后不再使用)
三、并发G1(jdk7开始使用,jdk8之后慢慢成熟)
1.新生代和老年代收集器,(jdk9默认的收集器)
2.物理上内存是不分区的,(old区和young区只是逻辑上的分区)
3.Region(堆内存中的一个单位内存)
4.STAB:Snapshot-At-The-Beginning,它是通过Root Tracing得到的,GC开始时候存活对象的快照,后面的垃圾回收就是根据这个做判断的。
5.Rset:记录了其他Region中对象引用本对象的关系,属于point-into结构(哪个对象引用了我)
6.YoungGC
首先新对象进入Eden区,
存活对象拷贝到Survivor区
当对象存活时间到达年龄阀值当时,对象晋升到old区。
7.MixedGC
G1中不存在fullGC。
回收所以的young区和部分old区。
8.global concurrent mark
Initial marking phase:标记GC root ,STW
Root region scanning phase:标记存活的region
Concurrent marking phase:标记存活的对象
Remark phase:重新标记,STW
Cleanup phase:部分标记,STW
9.参数
InitiatingHeapOccupancyParcent
堆占有率达到这个数值则触发global concurrent marking,默认为45%
G1HeapWasteParcent
在全局标记结束之后,可以知道有多少内存会被回收,在每次YoungGC和再次发生MixedGC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生MixedGC。
G1MixedGCThresholdPercent
Old区的region被回收的时候存活对象的占比
G1MixedGCCountTarget
一次全局标记之后,最多执行MixedGC的次数
G1OldCSetRegionThresholdPercent
一次MixedGC在Old区最多能够回收多少个region
-XX:+UseG1GC :是否开启G1
-XX:G1HeapRegionSize=n, region的大小,1~32M。最多为2048个region
-XX:ParallelGCThreads=n 并行垃圾收集的线程数,(需要停止应用程序)
-XX:ConcGCThreads=n 并发线程数=(1/4)*并行(比并发小,因为需要执行应用程序)
-XX:MaxGCPauseMillis=200 最大停顿时间
-XX:G1ReservePercent=10 保留内存,防治Young区中,Eden区S0区复制到S1区时内存不够,溢出
10.实践
年轻代大小:避免使用-Xmn、-XX:NewRatio等显示设置Young区的大小,会覆盖暂时时间目标
暂停时间目标:暂停时间不要太苛刻,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太苛刻会影响吞吐量
11.是否需要切换到G1
50%以上的堆被存活对象占用
对象分配和晋升的速度变化非常大
垃圾回收时间长,超过1秒