架构师训练营 - 作业 - 第九周
1、请简述 JVM 垃圾回收原理
答:JVM 启动后,会自动启动后台 GC 守护线程,用于自动的内存回收。
经典的垃圾回收算法主要有 3 种:
标记-清除算法:容易产生内存碎片
复制算法:内存只能利用一半
标记整理算法(标记压缩算法):就是 标记-复制-清除
分代算法:就是将内存分为多个区,根据特性,采用以上 3 种算法
经典的垃圾回收运行有 3 种方式
串行:单个线程执行垃圾回收,回收时用户线程处于等待状态
并行:多个线程执行垃圾回收,回收时用户线程处于等待状态
并发:用户线程和垃圾回收线程同时执行(不一定是并行,可能也会交替执行)
经典的垃圾回收器(生产中如果启动分配的堆大小<=4G,它们是非常成熟的。目前所在单位仍多用此配置)
允许的配合
G1 垃圾回收器(针对大内存的垃圾回收器)
G1 是新的垃圾回收器。它仍是分代的垃圾回收器。只不过,为了减少大内存在垃圾回收时的停顿,将内存分为 2048 个 Region,每个 Region 仍有 E、S、O 角色,然后新增了一个 umongous 的类型。
对于 E Region 的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者 Survivor 空间。
O Region,G1 收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1 完成了堆的压缩(至少是部分堆的压缩),这样也就不会有 cms 内存碎片问题的存在了
H Region,是新增有一种特殊的区域。 如果一个对象占用的空间超过了分区容量 50%以上,G1 收集器就认为这是一个巨型对象。这些巨型对象,默认直接会被分配在年老代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。G1 划分了一个 Humongous 区解决这个问题。H Region 用来专门存放巨型对象。如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区来存储。为了能找到连续的 H 区,有时候不得不启动 Full GC。
2、设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
答:
面对主要的挑战
对现有网站业务造成的冲击
高并发下的应用和数据库负载
突然增加的网络及服务器带宽
直接下单
应对的架构方案和思路
独立部署秒杀模块,与现有应用进行隔离
秒杀设计的商品页面静态化
将静态资源前置缓存到 CDN
动态生成随机下单页面 URL
评论