oopMap 安全点 主动式中断(抢断式中断) 安全区域
Serial收集器:单线程收集器,工作时必须暂停虚拟机的其他工作,STW
ParNew收集器:Serial收集器的多线程版本
Parallel Scavenge 收集器:新生代收集器,复制算法,并行。目的是达到一个可靠的吞吐量,原理是控制新生代的大小,吞吐量优先的收集器,也可以开启自动模式。
Serial Old收集器:单线程的老年代收集器
Parallel Old收集器:并行收集器的老年代版本
CMS收集器:获取最短停顿时间为目标的收集器,标记清除算法。
初始标记,并发标记,重新标记,并发清除。初始标记跟重新标记需要STW,但是时间很短暂,因为初始标记是标记GC Boots能关联到的对象,重新标记是修正并发标记期间标记产生变动的一部分。
缺点:1. 对CPU资源非常敏感,默认使用线程数是 (CPU线程 + 3)/4,CPU越多占用越少,但是只有2个的时候,会分出一半进行回收。2. 无法处理浮动垃圾。由于并发清理阶段用户线程还在使用,CMS无法在当次GC中处理,需要留待下一次GC,所以需要预留一部分空间给处理时用户程序使用,JDK1.5默认是老年代使用68%,1.6是92%,如果剩下的空间不够用户程序使用,则会出现“Concurrent Mode Fulure”,并且虚拟机启用后备预案,即Serial Old收集器,那么这样停顿时间就会很长。3. CMS是标记-清除算法,所以清理后空间是不连续的。可以通过参数配置多少次普通清除算法,然后进行一次整理。
G1收集器:标记整理算法。分代收集。并行与并发。可预测的停顿。G1中Java堆被分为多个大小相等的Region,根据各个Region的大小,维护一个优先列表,根据每次的允许时间,优先回收价值最大的region,这也是G1,Garbage First名称的由来,这种方式保证了收集器在最短的时间内完成尽可能高的效率。
由于没有了物理上的新生代老年代的概念,那么怎么解决对象引用的问题?通过每个Region维护的Remember Set来存储对象的地址,以便GC时快速准确的定位清除。
过程:初始标记,并发标记,最终标记,筛选回收