垃圾收集算法
标记-清除:顾名思义被标记的对象都会在GC过程中被清除,会产生大量的磁盘会产生大量的磁盘碎片空间
复制:牺牲一半堆空间,将存活对象复制到另一半堆空间
标记-整理:被标记GC的GC,存活的挨排站好
分代收集
垃圾收集器
现在对HotSpot虚拟机包含的所有收集器进行总结。图中展示了7种不同的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代还是老年代收集器。
Serial/Serial Old收集器运行示意图
从上图可以看出Serial收集器是一款单线程的收集器,“Stop the World”说明了其工作原理。其中,Serial在新生代采取复制算法,老年代采取标记-整理算法。
ParNew收集器
ParNew是Serial收集器的多线程版本,新生代依旧采取复制算法,老年代采用标记-整理算法。
Parallel Scavenge收集器
Parallel Scavenge收集器的特点是达到一个可控制的吞吐量,CMS等收集器关注的则是GC停顿时间。停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高的吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要设和在后台运算而不需要太多交互的任务。由于与吞吐量关系密切,Parallel Scavenge也常被称为“吞吐量优先”收集器。
Serial Old收集器
是Serial的老年代版本,使用标记-整理算法。
Parallel Old收集器
是Parallel Scavenge的老年代版本,在注重吞吐量和CPU资源敏感的场合,优先考虑Parallel Scavenge和Parallel Old组合。
CMS收集器
CMS是基于标记-清除算法,以获取最短GC停顿时间为目的的收集器。整个过程如下:
大致分为:初始标记->并发标记->重新标记->并发清除
G1收集器
特点:支持并发与并行,分代收集,空间整合和可预测停顿
G1能充分利用多CPU、多核环境下的硬件优势缩短GC停顿时间,通过并发的方式让Java程序继续执行。采用局部复制,整体标记-清理算法的空间整合策略。G1收集器之所以能够建立可预测停顿时间模型的关键在于G1有计划的避免在整个堆中进行垃圾回收,G1会跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region,但是Region并不是孤立的。一个对象分配在某个Region,它并非只能被本Region内的对象所引用,而是对整个Java堆可见的。那么再回收对象时,必须要扫描整个堆,严重影响效率。在G1收集器中使用Remembered Set来避免全队扫描。G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序在对引用类型的数据就行写操作时,先中断一下,检查Reference引用的对象是否处于不同的Region之中。如果是,便通过CardTable把相关信息写入到被引用Reference的Region的Remembered Set中。这样在进行内存回收时,在枚举GC Root时加入Remembered Set即可保证不对全堆扫描也不会出现遗漏。如下图:
如果不算维护Remembered Set的操作,G1收集器运作大致可以分为以下几个步骤:
初始标记->并发标记->最终标记-> 筛选回收
如图所示