JVM GC

2019-01-08  本文已影响0人  Aiibai

GC需要完成三件事情

1. 如何判断一个对象可以回收了

有两种方式:引用计数算法 根搜索算法

既然两种判断对象是否可用都与引用有关,那么究竟都有那些引用呢?

最后,如果对象不可达,一定会非死不可吗,不一定。
要正真觉得一个对象死亡,还需要至少两次标记过程。
如果对象在进行根搜索后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize() 方法。当对象没有覆盖 finalize()方法,或者 finalize() 方法已经被虚拟机调用过,虚拟机认为这两种情况没有必要调用。
将有必要执行 finalize() 方法的对象放入名为 F-Queue 的队列中,稍后虚拟机调用这些对象的 finalize() 方法,这个时候可以拯救一些对象,将需要拯救的对象与引用链建立关系。稍后 GC 将对 F-Queue 中的对象进行第二次的标记,被拯救的对象会被移除集合中。

2.垃圾收集算法

优点:

缺点:

优点:

缺点:

应用:
IBM研究表明,新生代 98% 的对象都是朝生夕死的,所以并不需要 1:1 来划分内存空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor 。当回收时,将 EdenSurvivor 中还存活的对象一次性拷贝到另一块 Survivor 空间上,最后清理掉 Eden 和刚才使用过的 Survivor 空间。 HotSpot 虚拟机默认 EdenSurvivor 大小比例为 : 8:1。当 Survivor 空间不够用时,需要依赖其他内存(老年代)进行分配担保(Handle Promotion)。

3. 垃圾收集器

java 虚拟机规范没有对垃圾收集器应该如何实现做出规定,因此不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会差别很大,下面的讨论是基于 Sun HotSpot 虚拟机。

垃圾收集器

图中如果两个垃圾收集器之间存在连线,表明它们可以搭配使用。

Serial 收集器
是(JDK 1.3.1 之前)是虚拟机新生代收集的唯一选择。是单线程收集,单线程不仅仅表示只会使用一个 CPU或一条收集线程完成垃圾收集工作,更重要的是它在收集时,其他所有工作线程都要停止(Stop The World)。

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

缺点:

优点:

使用场景:
对于 Client 模式下的虚拟机来说,由于分配的内存较小,停顿时间较短。

ParNew 收集器
ParNew 收集器Serial 收集器的多线程版本,其余行为完全一样(包括:控制参数、收集算法、Stop The World、对象分配规则、回收策略等)。

ParNew/SerialOld 收集器运行示意图

ParNew 收集器Server 模式下的虚拟机首选的新生代垃圾收集器,即使它相对 Serial 收集器 没有太多的改进,因为除了 Serial 收集器,只有它能与 CMS 收集器 搭配使用。
ParNew 收集器 也是使用 -XX:+UseConcMarkSweepGC 选项后的默认新生代收集器,也可以使用 -XX+UseParNewGC 选项强制指定它。
默认 ParNew 收集器 开启的收集线程与 CPU 的数量相同,也可以通过 -XX:ParallelGCThreads 指定。

ParNew 收集器 是并行收集器, CMS 收集器 是并发收集器。
并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
并发(Concurrent) :指用户线程和垃圾收集线程同时执行。

Parallel Scavenge 收集器
Parallel Scavenge 收集器 也是一个新生代收集器,使用复制算法,也是并行多线程收集。不过它的一个显著的特点是:其他垃圾收集器关注的是尽量缩短用户线程的停顿时间,而它关注的是吞吐量。所谓吞吐量就是CPU用于执行用户线程所用时间与CPU总消耗时间的比值(吞吐量=运行用户代码时间 / (运行用户代码时间+垃圾收集时间))。

停顿时间越短越适合于交互式程序,而高吞吐量可以高效的使用CPU,适合计算密集型程序。

Parallel Scavenge 收集器 提供了两个参数用于精确控制吞吐量,分别是:-XX:MaxGCPauseMillis-XX:GCTimeRatio
除了上面的两个参数外,有另外一个参数比较重要 :-XX"+UseAdptiveSizePolicy ,当这个参数打开以后,就不需要手动指定新生代的大小(-Xmn) 、EdenSurvivoer 的比例(-XX:SurvivorRatio)以及晋升老年代的对象年龄(-XX:PrertenureSizeThreshold)等细节参数。虚拟机将会根据设定的最大GC停顿时间或者吞吐量,自动调整。

Serial Old 收集器
Serial Old 收集器Serial 收集器的老年代版本,同样是单线程的,使用标记整理算法。主要适用于 Client 模式下的虚拟机,在 Server 模式下,主要有两个用途:1. 在 JDK 1.5 以及之前的版本中,与 Parallel Scavenge 收集器 搭配使用。2. 作为 CMS 收集器的后备预案,在并发收集发生 Concurrent Mode Failure 的时候使用。

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

Paralledl Old 收集器
Parallel Scavenge 收集器 的老年代版本。多线程标记整理吞吐量优先收集器。

image.png

CMS 收集器
CMS 收集器 是一种以获取最大回收停顿时间为目标的收集器。是基于 标记-清除算法实现的,收集过程分为四个阶段:

缺点:

G1 收集器
https://www.jianshu.com/p/e99000058840
http://www.importnew.com/27793.html

image.png
上一篇 下一篇

猜你喜欢

热点阅读