写点什么

架构师训练营第九周作业

用户头像
子豪sirius
关注
发布于: 2020 年 08 月 05 日
  • 请简述 JVM 垃圾回收原理。

JVM 垃圾回收涉及以下几个问题:

1、如何确定要回收的对象

一般通过对象的可达性分析来标记对象。从引用对象的成员变量(在线程栈)或者静态成员变量、常量(在堆区)出发,如果对象可达,就对对象标记。没有标记的对象为不可达。不可达的对象进行回收。

2、回收对象的方法。

主要有清理、压缩、复制三种方法:

清理:将垃圾对象占据的内存清理掉。通过把要回收的垃圾对象所占用的内存标记为空闲。

压缩:从堆空间头开始,将存活的对象 Copy 放在一个连续的空间中,其余空间就是连续的空余空间

复制:将堆空间分为两部分,其中一部分创建对象,当这部分空间用完时,将标记过的对象复制到另一个空间。

3、JVM 的分代回收

因为大部分对象的使用周期都比较短,为了提高回收的效率,对对象进行分代。堆空间划分为新生代和老年代区。新生代空间用完后进行标记和对象回收,可达的对象复制到老年代。老年代的空间不足时采用压缩或者清理的方法进行回收。

4、回收算法

常用的是串行回收、并行回收、并行 CMS 回收和 G1 回收

串行回收:只用要一个线程进行垃圾回收。线程回收时其他工作线程进入 Stop the world 状态,停止工作,等待回收线程回收完再继续。

并行回收:相比串行回收,采用多个线程进行回收,回收时其他工作线程也是进入 Stop the world 状态。

并行 CMS 回收:初始化 stop the world 进行标记;然后 CMS 线程和其他工作线程并发运行进行标记;之后其他工作线程 stop the world,重标记修正之前工作修改的对象引用;CMS 和其他工作对象并发进行清理

G1 回收:G1 回收跟 CMS 回收一样,也经历四个阶段:初始化标记、并发标记、重标记、并发回收。


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


用户头像

子豪sirius

关注

还未添加个人签名 2018.05.03 加入

还未添加个人简介

评论

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