深入理解JVM——java回收算法、收集器原理

垃圾收集算法

标记-清除:顾名思义被标记的对象都会在GC过程中被清除,会产生大量的磁盘会产生大量的磁盘碎片空间

复制:牺牲一半堆空间,将存活对象复制到另一半堆空间

标记-整理:被标记GCGC,存活的挨排站好

分代收集

垃圾收集器


现在对HotSpot虚拟机包含的所有收集器进行总结。图中展示了7种不同的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代还是老年代收集器。

Serial收集器

Serial/Serial Old收集器运行示意图

 

从上图可以看出Serial收集器是一款单线程的收集器,“Stop the World”说明了其工作原理。其中,Serial在新生代采取复制算法,老年代采取标记-整理算法。

ParNew收集器

ParNewSerial收集器的多线程版本,新生代依旧采取复制算法,老年代采用标记-整理算法。

 

Parallel Scavenge收集器

Parallel Scavenge收集器的特点是达到一个可控制的吞吐量,CMS等收集器关注的则是GC停顿时间。停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高的吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要设和在后台运算而不需要太多交互的任务。由于与吞吐量关系密切,Parallel Scavenge也常被称为“吞吐量优先”收集器。

Serial Old收集器

Serial的老年代版本,使用标记-整理算法。


Parallel Old收集器

Parallel Scavenge的老年代版本,在注重吞吐量和CPU资源敏感的场合,优先考虑Parallel ScavengeParallel 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把相关信息写入到被引用ReferenceRegionRemembered Set中。这样在进行内存回收时,在枚举GC Root时加入Remembered Set即可保证不对全堆扫描也不会出现遗漏。如下图:

 

如果不算维护Remembered Set的操作,G1收集器运作大致可以分为以下几个步骤:

初始标记->并发标记->最终标记-> 筛选回收

如图所示


猜你喜欢

转载自blog.csdn.net/qq_34218892/article/details/80634661
今日推荐