架构师训练营第九周作业
请简述 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 回收一样,也经历四个阶段:初始化标记、并发标记、重标记、并发回收。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
评论