架构师训练营第九周作业
一、请简述 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 集群
进行动静分离,将静态资源放到专门的集群
将服务进行集群化
对用户的请求进行分级限流,并且只放最前面的一部分请求进入(防止秒杀器)
简化流程,将不需要的流程去掉
版权声明: 本文为 InfoQ 作者【月殇】的原创文章。
原文链接:【http://xie.infoq.cn/article/4b860faa885eb8a78b51d2bba】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论