写点什么

架构师训练营第九周作业

用户头像
月殇
关注
发布于: 2020 年 11 月 22 日

一、请简述 JVM 垃圾回收原理。

JVM 垃圾回收就是将堆中不再使用的对象回收掉,释放出内存资源。

要知道 JVM 垃圾回收的原理,需要知道以下几点:

1、JVM 如何确定堆中的对象是否是垃圾?

2、JVM 如何进行垃圾回收?使用了那些算法?

3、堆中的内存模型具体是怎样的?不同的内存区域是否使用不同的垃圾回收算法?


首先,JVM 是通过可达性分析来确定堆中的对象是否是垃圾。

可达性分析:JVM 是通过一些 GCRoot 根对象来判断堆中的对象是否被引用到,如果对象被直接引用或者间接引用到,则标记该对象,表示该对象不是垃圾,其他没有被引用到的对象则是垃圾;

可以作为 GCRoot 对象的有以下这些:

线程栈帧中的局部变量

方法区的静态变量


其次,在标记完成之后可进行垃圾回收,垃圾回收算法有以下三种:

复制回收算法:在发生 GC 时,该算法主要用于堆中新生代的 Survivor From 和 Survivor To 两个区域,在进行垃圾回收时,会将 From(To)区的存活对象放入到 To(From)区,然后将 From(To)区的对象全部清除;

优点是不会有内存碎片,缺点是需要使用双倍的内存区间,总有一个内存区间是空闲的

标记-清除算法:在发生 GC 时,该算法会将垃圾对象进行清除,当然 JVM 不会真的将这些垃圾清理,而是将这些垃圾占用的内存空间标记为空闲,记录在空闲列表中,当需要创建新对象时会从空闲列表中找一块内存区域分配给该对象

优点是不会出现一个空闲的内存区域,缺点是存在内存碎片

标记-整理算法:在发生 GC 时,会将存活的对象整理放到堆空间的开头的地方,那么其余的空间就是连续的空闲空间

优点时不会有一个空闲的内存区域,也不会有内存碎片,缺点是 GC 时间长

标记-清除算法和标记-整理算法都是针对堆中的老年代


垃圾回收模型:

串行回收:每次在 GC 时,会有一个垃圾回收线程去标记并清理垃圾,这个过程中任务线程都会被阻塞住,存在 Stop The World 的现象

并行回收:每次在 GC 时,工作线程停止手头的工作去进行标记清理垃圾,存在 Stop The World 的现象

并发回收 CMS:每次在 GC 时,会分成四个阶段

初始化标记:这个阶段工作线程会阻塞,但是垃圾线程会很快的进行一次标记,Stop The World 时间很短

并发标记:这个阶段工作线程正常工作,同时垃圾回收线程会进行标记

重新标记:这个阶段工作线程会阻塞,工作线程和垃圾回收线程进行标记,但是这个阶段的垃圾很少,都是在并发标记阶段没有被垃圾回收线程标记到的垃圾

并发清理:这个阶段垃圾回收线程进行垃圾的清理工作


G1 垃圾回收内存管理机制:

JVM 将堆分成一个个小块,每一块都有自己的生命周期,生命周期为 Eden->Survivor->Old->Humongous

当进行 GC 时,工作线程都会停止手头的工作去进行标记垃圾,标记完成后由一个线程进行垃圾清理,其他工作线程正常工作


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

挑战和问题:

瞬间高并发问题

网络带宽耗尽

服务器 Load 飙升,停止响应

数据库瘫痪


思路:

隔离当前系统和秒杀系统有差异的部分,特别是高并发的部分要进行隔离

加大网络带宽

准备专门的 Http 集群

将图片放到 Nginx 集群

进行动静分离,将静态资源放到专门的集群

将服务进行集群化

对用户的请求进行分级限流,并且只放最前面的一部分请求进入(防止秒杀器)

简化流程,将不需要的流程去掉

发布于: 2020 年 11 月 22 日阅读数: 15
用户头像

月殇

关注

还未添加个人签名 2019.04.15 加入

还未添加个人简介

评论

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