Serial收集器
特点:
单线程,相对于多线程不会发生因为线程交互带来损耗,在客户端单核处理器下是运行速度最快的。
并行的,会发生stw(垃圾收集的时候只有收集器在工作),因为在客户端留给虚拟机的内存空间很小垃圾回收速度很快,stw时间很短。
ParNew收集器
特点:
看做是serial收集器的多线程版本,在单核处理器下serial更快,但在服务端多核处理器下parnew更快,通过用-XX:ParallelGCThreads可以现在多核多核处理下parnew并行的数量
可以和cms收集器搭配让parnew地位提高,随着G1的出现parnew成为了cms处理新生代的一部分,单独设定parnew的语句废除掉了,只能通过设定cms来使用parnew。
Parallel Scavenge收集器
特点:
也是并行的收集器相比parnew,此收集器更注重吞吐量
参数:
设定stw时间(-XX:MaxGCPauseMillis),不能设定的太小,若小的话系统就会自动减少新生代的内存(这样垃圾收集的时间变短stw变短),垃圾回收的频率就会增加,同时还会降低吞吐量(运行100s两次垃圾收集每次10秒,现在运行100s5次垃圾收集每次5s)。
直接设定垃圾收集时间占总时间的比率(-XX:GCTimeRatio)。
设定自适应调节(-XX:+UseAdaptiveSizePolicy),当对虚拟机结构不了解的情况下可以把该参数打开,设定了xms,stw时间,和垃圾收集时间占总时间的比率后就可以自动为虚拟机调优,这也是区别是Parallel Scavenge还是parnew收集器的重要标志。
Serial Old收集器
特点:
是serial new的老年代版本,也是单线程的,运用与客户端
也可以用在服务端,和Parallel Scavenge搭配使用,也可以和parnew+cms组合搭配作为cms的预备版本。
Parallel Old收集器
特点:
Parallel Scavenge和Serial Old因为Serial Old的拖累在吞吐量还没有parnew+cms高,直到Parallel Old出现,Parallel Scavenge+Parallel Old组合适用于处理器资源稀缺而且要求吞吐量高的服务器使用。
CMS收集器
特点:
cms收集器是并发收集器,允许用户线程和收集器线程一起执行
步骤:
初始标记:
该阶段是标记和gcroot结点直接连接的结点,是单线程的并行的,不允许用户线程一起执行,但stw时间十分短可以忽略不计
并发标记:
继续标记从gcroot向下延伸的全部结点,是多线程并发的。
重新标记:
记录并发标记阶段因用户线程发生变化的标记对象,多线程,并行的。
并发清除:
回收标记阶段判断死亡的对象进行垃圾收集,并发的多线程的。
缺点:
当服务器小于4核时,cms会占用大量的内存,大于4核时会占用25%的内存。
cms收集是并发的,为了给用户线程留足够的空间,老年代不能内存满再进行垃圾收集,若老年代空余的内存不够运行用户线程,就会终止cms冻结用户线程,同时启用serial old来收集。
在垃圾收集阶段是并发的,还会有用户线程在该阶段产生垃圾,这些垃圾称为浮动垃圾不能在当次垃圾收集回收掉。
垃圾收集阶段是标记清理,当再存大容量的数据时很可能因为没有足够空间存放导致full gc从而造成更长的stw。
Garbage First收集器
特点:
内存不像传统垃圾收集器被分为新生代,老年代,而是被分为了一个个region区域,某些region区域的集合为新生代,某些为老年代,没有固定的大小。当存放对象的大小超过了半个region区大小就会存放在由两个region区联合构成的Humongous区中。
可以指定具体的stw时间,根据指定的stw时间和上边的,找到有最大收益的region区域,估算出每块region区域大致的收集时间,开始分配具体的region区域收集。
每个region都有一个记忆集用来记录跨代引用,每个记忆集都用哈希表实现,key是其他region区指向自己的指针,value是自身卡表的索引号,而每个卡表记录了从自身指向其他region区域的指针。G1的收集器记录了双向指针。相比之下cms的记忆集只记录了从老年代到新生代的单向指针(因为新生代有随生随灭的不稳定性)。对于维护方面cms和G1都使用了写后屏障来维护。
步骤:
初始标记:
同cms。
并发标记:
同cms,最后还要处理原始快照下的因用户线程变动的标记。
最终标记:
用于处理TAMS中的那一些数据,多线程并行的。
筛选回收:
通过设定指定的stw时间,对部分region区域回收,速度很快,单线程并行的。
用户线程运行对垃圾收集产生的影响:
并发标记阶段,对于该阶段,用户线程同时运行,对标记变量产生的影响,cms使用了增量更新算法,g1使用了原始快照算法(SATB),同时还需要写前屏障来记录发生变化的指针,开销相对于cms比更大,cms可以同步的运行增量更新算法,G1只能把原始快照算法和写前屏障放入消息队列中异步的运行。用户线程运行阶段新产生的对象,G1在region区域开辟了两个指针TAMS,新对象的地址就存在TAMS中,垃圾收集时默认对这两个指针地址上的区域不进行垃圾收集。
筛选回收阶段:
cms是标记清除法,G1是标记整理算法。
整体的stw时间设定:
若stw时间设定太短的话,每次只能回收一点region区域,当堆区垃圾收集的速度赶不上垃圾产生的速度就会堆溢出发生full gc,从而发生更大stw。
收集器的权衡
第一方面:
根据电脑的系统(windows,linux),根据电脑的核数,电脑内存等来判断。
第二方面:
根据jdk的版本来选择
第三方面:
根据需求来选择,吞吐量优先还是低延迟优先(小的stw)。