第一种:serial(串行,新生代收集器):单线程收集器,执行时它会停掉所有其他的线程,直到它收集结束;在用户不可见的情况先将用户所有的线程停掉,是很难接受(新生代收集器的选择,后面还会介绍serial old 专用老年代的收集器,采用标记整理的算法)
第二种:ParNew收集器(新生代收集器)其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio、 -XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样;它是许多运行在server模式下的虚拟机中首选的新生代收集器,它是为一个可以和cms收集器配合使用
parnew收集器和serial的比较:
parallel Scanvenge收集器(新生代收集器):采用复制算法的并行的多线程收集器,它的目的是达到一个可控制的吞吐量(throughtput)t吞吐量就是java虚拟机用于运行用户代码的时间与cpu运行总时间的比值
Serial old 收集器:是serial收集器的老年代版本,它同样是一个单线程收集器,采用标记-整理的算法,这个收集器的主要意义也是被客户端模式的虚拟机使用;
他可以与parallel scavenge新生代收集器收搭配使用,
parallel old (老年代收集器)使用多线程和“标记整理”算法,可以和parallel scavenge 新生代收集器组合使用,
cms收集器:是基于“标记-清除”算法实现的,整个过程分为四个步骤,包括:
初始标记(cms initial mark)
并发标记(cms) concurrent mark
重新标记(cms remark)
并发清除(cms concurrent sweep)
i
缺点:cms收集器无法处理浮动垃圾,因为他在并发标记时,用户线程还在运行着,
缺点二:基于标记清除算法 会产生内存碎片,会很快引起第二次垃圾回收
G1收集器:是单签收集器技术发展的最前沿成果,与cms收集器相比有明显的改进
第一:基于标记整理算法实现的收集器,
第二,非常精确的控制停顿
G1将整个java堆(包括新生代,老年代,)划分为多个大小固定的独立区域(region)
并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域,区域划分,及有优先级的区域回收
保证了G1收集器在有限的时间内可以获得最高的收集效率