JVM垃圾回收算法和垃圾收集器笔记

概述

程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存.

判断对象是否是垃圾的算法

JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(reference chain),当对一个对象到GC Roots没有任何引用链时,则证明对象不可用的.

判定对象死亡

判定一个对象是否死亡,至少要经历2次标记.如果GC时,经过可达行分析对象不可用,将标记第一次并且进行第一次筛选,筛选条件是对象的finaliz()方法被覆盖且没有执行过.然后放入F-Queue队列中.第二次标记是对F-Queue队列,看对象是否在finalize()方法中拯救自己,否则进行回收.任何对象的finalize()方法都只会被系统自动调用一次,强烈不推荐使用finalize()方法.

垃圾回收算法

  • 标记-清除算法

最基础的算法,其它算法是对它的完善和补充

  • 复制算法

现在虚拟机都采用这种收集算法来回收新生代.

  • 标记-整理算法

也可称标记-压缩算法.回收老年代采用了这种算法.

HotSpot的算法实现

  • 枚举根节点

  • 安全点停顿GC

  • 安全区域GC

垃圾收集器

Serial收集器

Serial垃圾收集器是最基本,历史最悠久的收集器.

单线程GC,回收时”Stop the world”.采用复制算法.

对于运行Client模式下的虚拟机来说是一个不错的选择.

Serial Old收集器

Serial Old收集器是Serial的老年代版本.采用标记-整理算法.

ParNew收集器

ParNew收集器是Serial垃圾收集器的多线程版本。

Parallel Scavenge收集器

Parallel Scavenge收集器是新生代收集器,它采用复制算法收集,又是并行的多线程收集器.

Parallel Scavenge收集器最主要目的是达到一个可控制的吞吐量.吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和”标记-整理”算法.

CMS收集器

CMS(Concurrent Mark Sweep)收集器是以一种获取最短回收停顿时间为目标的收集器.

4个步骤

  • 初始标记(Stop the world)

  • 并发标记

  • 重新标记(Stop the world)

  • 并发清除

G1收集器

并行和并发,分代收集,空间整合,可预测停顿

你可能感兴趣的:(jvm,垃圾收集)