写点什么

JVM 垃圾回收原理(训练营第 9 课)

用户头像
看山是山
关注
发布于: 2020 年 08 月 06 日

作业

请简述 JVM 垃圾回收原理。

设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?

JVM 垃圾回收原理

JVM 垃圾回收从流程上大概可以两个步骤;第一步是找到需要回收的对象(垃圾),第二步是清理这些待回收对象。

找到待回收对象

可达性分析算法:通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,并标记搜索到的所有引用对象。搜索所走过的路径称为引用链;当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的,即为可回收的垃圾对象。

GCRoots的对象包括下面几种:

(1). 虚拟机栈中引用的对象,亦即 线程栈帧中的局部变量

(2). 方法区中的类静态属性引用的对象。

(3). 方法区中常量引用的对象。

(4). 本地方法栈中JNI(Native方法)引用的对象。

回收垃圾对象

回收垃圾主要有下面几种算法,常用的垃圾收集器一般采用分代收集的方法来实现,通常是是几种算法的集合。

标记-清除 算法(Mark-Sweep)

分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。

由于被回收对象不是集中在一起,所有会产生大量不连续的内存碎片;可能会导致程序运行过程中在需要分配较大对象时,无法找到足够的连续内存可供分配。

标记-整理 算法(Mark-Compact)

与标记-清除算法类似,不过不是直接对可回收对象进行清理;而是把所有存活对象都像堆空间的头部拷贝并存放在一段连续的内存空间里,然后直接清理掉边界以外的内存。



复制 算法 (Copying)

将可用的内存分为两块,每次只用其中一块,当这一块内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次性清理掉。

该算法由于只有一般内存可供使用,空间利用率较低。一般会通过变种后被用来 新生代 执行垃圾回收。

分代垃圾回收

JDK 1.7 之前的主流算法是分代垃圾回收;它结合了上面的几种算法而成。

该算法把整个内存区分为 新生代和老年代。

其中新生代又分为一个较大的 Eden 区 和 两个较小的 Survivor - From/To 区,主要是采用上面的 复制算法进行回收。



新建对象会先进入 Eden 区,当 Eden 区满了进行回收时,把 Eden 区和一个Survivor 空间(如 From 区)存活着的对象全部复制到另外一块 Survivor 空间(To 区)上,然后清理掉 Eden 区和刚才用过的 Survivor 空间(From 区)。

接下来继续在 Eden 区创建新对象,到下一次垃圾回收时,则轮换为另一个 Survivor 区(To 区)和 Eden 区一起复制到原先已清空的 Survivor 区(From 区)。



当一个对象经过多次 Survivor 空间复制后(一般 10 次),仍然存活;则复制到 老年代。当老年代的可用空间满了之后,一般就采用上面的 标记-清理 或者 标记-整理 算法进行垃圾回收。

垃圾收集器

根据上述算法,HotSpot JVM 大概有下面一些收集器

Serial 收集器(串行收集器)

采用复制算法的单线程的收集器。

ParNew 收集器(并行收集器)

Serial 收集器的多线程版本。

Parallel Scavenge 收集器

吞吐量优先收集器

Serial Old 收集器

Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理算法”,

Parallel Old 收集器

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

CMS 收集器

CMS(Conrrurent Mark Sweep)收集器是以获取最短回收停顿时间为目标的老年代垃圾收集器;使用“标记 - 清除”算法。

收集过程分为如下四步:

(1). 初始标记,标记GCRoots能直接关联到的对象,时间很短。(STW)

(2). 并发标记,进行GCRoots Tracing(可达性分析)过程,时间很长。

(3). 重新标记,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长。(STW)

(4). 并发清除,回收内存空间,时间很长。

G1 收集器

JDK 8 后主流的垃圾收集器。(JDK 7 引入)

G1 (Garbage First)是一个分代的,增量的,并行与并发的标记-复制垃圾回收器,囊括了新生代和老年代的垃圾回收。

G1垃圾回收器依然是一个分代垃圾回收器。但是它与一般的回收器所不同的是,它引入了额外的概念,Region。G1垃圾回收器把堆划分成一个个大小相同的Region。在HotSpot的实现中,整个堆被划分成2048左右个Region。



G1回收器和CMS比起来,有以下不同:

  1. G1垃圾回收器是compacting的,因此其回收得到的空间是连续的。这避免了CMS回收器因为不连续空间所造成的问题。

  2. G1回收器的内存与CMS回收器要求的内存模型有极大的不同。G1将内存划分一个个固定大小的region,每个region可以是年轻代、老年代的一个。内存的回收是以 region 作为基本单位的;



用户头像

看山是山

关注

还未添加个人签名 2018.11.16 加入

还未添加个人简介

评论

发布
暂无评论
JVM 垃圾回收原理(训练营第 9 课)