2.5 垃圾收集器

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时快速准确的定位清除。

    过程:初始标记,并发标记,最终标记,筛选回收

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容