可靠的采集神器(G1跟踪各个Region里面的垃圾堆积的价值是什么? )
优采云 发布时间: 2021-12-31 06:20可靠的采集神器(G1跟踪各个Region里面的垃圾堆积的价值是什么?
)
cms 采集器
cms(Concurrent Mark Sweep)采集器是一个旨在获得最短恢复暂停时间的采集器。这与那些集中在互连网站的服务器或B/S系统上的非常一致。应用程序,这些应用程序非常重视服务的响应速度。从名字(“Mark Sweep”)可以看出,它是基于“mark-sweep”算法实现的。
cms采集器工作的整个过程分为以下4个步骤:
由于整个进程中耗时最长的并发标记和并发清除进程采集器线程可以与用户线程一起工作,一般情况下,cms采集器的内存回收过程是与用户线程并发执行的。下图可以清楚的看到cms采集器的操作步骤中的并发和暂停时间:
优势
cms 是一位优秀的采集器。它的主要优点已经体现在名称上:并发采集、低暂停,所以cms采集器也被称为并发低暂停采集器(Concurrent Low Pause Collector)。
缺点
G1采集器
G1(Garbage-First)采集器是当今采集器技术发展中最前沿的成果之一。它是服务器端应用程序的垃圾采集器。HotSpot 开发团队赋予它一个使命(在长期)未来替换 JDK 1.5 中发布的 cms 采集器。与其他GC采集器相比,G1具有以下特点:
跨越整个堆内存
G1之前的其他采集器的采集范围是整个年轻代或年老代,但G1不再如此。当使用 G1 时,Java 堆的内存布局与其他采集器有很大不同。它将整个Java堆划分为多个大小相等的独立区域(Region)。虽然仍然保留了新生代和老年代的概念,但是新生代和老年代在物理上不再是分离的,而是一部分Region的集合(不一定是连续的)。
构建可预测的时间模型
G1 采集器可以建立可预测的暂停时间模型,因为它可以系统地避免整个 Java 堆中的垃圾采集。G1跟踪每个Region的垃圾累积值(回收获得的空间量和回收所需时间的经验值),在后台维护一个优先级列表,每次根据允许的回收时间,优先级为给予回收价值最高的区域(这就是垃圾优先这个名字的由来)。这种使用Region来划分内存空间和优先区域回收,保证了G1采集器在有限的时间内获得尽可能高的采集效率。
避免全堆扫描-Remembered Set
G1 将 Java 堆划分为多个 Region,即“拆分成部分”。但是,Region 不能孤立。一个Region中分配的对象可以与整个Java堆中的任何一个对象都存在引用关系。在做可达性分析判断对象是否存活时,需要扫描整个Java堆来保证准确性,这显然对GC效率是一个很大的危害。
为了避免全堆扫描的发生,虚拟机在G1中为每个Region维护了一个对应的Remembered Set。虚拟机发现,当程序写入Reference类型数据时,会产生Write Barrier来暂时中断写操作,并检查Reference引用的对象是否在不同的Region(生成的例子中,就是检查老年代是否在对象是指新生代中的对象),如果是,则通过CardTable将相关引用信息记录在被引用对象所属Region的Remembered Set中。回收内存时,在GC根节点的枚举范围中加入Remembered Set,可以保证不扫描满堆,不会有遗漏。
如果不计算维护Remembered Set的操作,G1采集器的操作大致可以分为以下几个步骤:
下图可以清晰的看到G1采集器的操作步骤中的并发和暂停阶段(在Safepoint):
总结采集器表: