写点什么

架构师训练营第九周命题作业

用户头像
0x12FD16B
关注
发布于: 2020 年 08 月 06 日
  • 请简述 JVM 垃圾回收原理。

JVM 垃圾回收指的是将 JVM 堆中的已经不再被使用的对象清理掉。

JVM 如何识别堆中的垃圾

JVM 通过一种可达性分析算法进行垃圾对象的识别, 具体的过程是: 从线程栈帧中的局部变量, 或者是方法区的静态变量出发, 将这些变量引用的对象进行标记, 然后看这些被标记的对象是否引用了其他对象, 继续进行标记, 所有被标记过的对象都是被使用的对象, 而那些没有被标记的对象就是可回收的垃圾对象了。

进行完标记以后, JVM 就会对垃圾对象占用的内存进行回收, 回收主要有三种算法

  1. 清理: 将对象垃圾占据的内存清理掉, 其实 JVM 并不会真的将这些垃圾内存进行清理, 而是将这些垃圾对象占用的内存空间标记为空闲, 记录在一个空闲内存列表中, 当应用程序需要创建新对象的时候, 就从空闲列表中找一段空闲内存分配给这个新对象。

  2. 压缩: 从堆空间的头部开始, 将存活的对象拷贝放在一段连续空间中, 那么其余的空间就是连续的空闲空间。

  3. 复制: 将堆空间分成两部分, 只在其中一部分创建对象, 当这个部分空间用完的时候, 将标记过的可用对象复制到另一个空间中。

JVM 的分代垃圾回收算法

JVM 将堆空间划分为新生代和老年代, 其中新生代又被划分为 Eden 区, 两个 Survivor 区: From 区, To 区。

新生代的对象的特点是对象存活的周期特别短,垃圾对象产生的速度会特别快,因此新生代使用复制算法进行垃圾回收,具体的过程是,新生代所有通过可达性分析后存活的对象被移动到 Survivor 区内, Survivor From 和 Survivor To 的空间反复进行空间复制完成对象的清理, 清理完成之后, From 和 To 切换, 即清理之前的 From 成为逻辑上的 To,所有存活的对象每经历过一次垃圾回收,对象的 "年龄" 增加 1, 如果到达一定的年龄后还存活的对象会晋升到老年代。

JVM 垃圾回收的算法

  • 串行垃圾回收器: 单线程串行进行垃圾回收, 在进行垃圾回收的时候会停止用户线程

  • 并行回收器: 多线程并行进行垃圾回收, 在进行垃圾回收的时候会停止用户线程

  • 并发回收器 CMS: 并发标记清除算法, 分为四个阶段, 初始标记, 并发标记, 重标记, 并发清理, 四个阶段中的并发标记和并发清理阶段垃圾回收线程和用户线程并发执行

  • G1 回收器: G1是一个分代的,增量的,并行与并发的标记-复制垃圾回收器, 它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量



用户头像

0x12FD16B

关注

还未添加个人签名 2018.01.19 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周命题作业