架构师训练营 - 第九周 - 作业一
作业一
请简述 JVM 垃圾回收原理
在 Java 程序运行过程中总会产生对象,这些对象存放在堆中,我们要及时清除不再使用的对象,为新的对象腾出空间。
具体步骤
标记
通过可达性分析算法进行垃圾对象的识别;一般会从 GC Root(线程栈帧中的局部变量、方法区的静态变量)开始,找到还在使用的对象进行标记。
回收
主要分为 3 种:
清理
将垃圾对象清除,具体实现是将这些垃圾对象占用空间标记为空闲,记录在一个空闲列表中,当需要创建新对象时,从空闲列表中找一段空闲内存分配给这个新对象。
压缩
从堆空间的头部开始,将存货对象拷贝在一段连续内存空间,其余空间就是空闲空间。
复制
将堆空间分为两部分,其中一部分创建对象,当这部分用完之后,将标记过的可用对象复制到另一个空间中。
具体使用哪种方法,根据实际情况而定,比如年轻代对象生命周期短,会使用复制算法,效率更高。
作业二
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
面对的挑战
瞬间高并发
在秒杀时,并发会急剧增加,应用 QPS 瞬时可能达到平时百倍水平,会导致带宽耗尽,服务器崩溃。
秒杀逻辑
在秒杀前,用户会不断刷新页面,准备抢先下单;甚至可能跳过秒杀页面,直接进入下单页面,需要做好秒杀下单逻辑。
架构思路
静态化
将页面转化为静态页面,避免动态页面对服务器 CPU 的消耗;同时静态化之后可以把页面分发的 cdn 上,用户可以快速获取。
并发控制
根据秒杀页面场景,只能有极少部分人抢到商品,所以做好限流器,放入一小部分人进入秒杀页面,从而有效降低服务器压力。
简化流程
砍掉不重要的分支流程,聚焦于下单操作,来提升可靠性。
评论