架构师培训 -09 JVM、秒杀
1.请简述 JVM 垃圾回收原理
要进行垃圾回收第一步就得找到哪些是垃圾,判断对象是否为垃圾算法有引用计数算法和可达性算法。由于引用计数算法无法解决循环引用的问题,所以基本都用可达性算法来判断对象是否为垃圾,栈的引用对象,方法区中的静态引用和常量引用可以作为 GC roots 对象。
找到谁是垃圾后,就要考虑用什么算法进行回收,有标记-清除、复制算法和标记-整理三种算法。
根据上面三种算法 JVM 实现了很多种垃圾回收器,有串行回收器,并行回收器,并发回收器 cms 和 G1 回收器,这些回收器在垃圾回收过程中都会有 STW。(还有 ZGC 等新垃圾回收器)
在垃圾回收时,常用分代回收的方式进行回收,整体分为年轻代和老年代。年轻代又分为 end 和两个 S 区,年轻代的特点是对象存活时间短;老年代存放年轻代在经过多次回收后还不能回收的对象。
2.设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀系统主要挑战:瞬间高并发
主要问题:绕过秒杀页面直接进入下单页面
主要解决思路
1.独立部署:将秒杀系统进行独立部署,可以使秒杀系统做些简化处理,同时也减少对其他业务系统的影响。
2.静态化:对于用户非个性化的数据可以由前端请求的数据改成静态在页面上,减少与后端的请求。
3.限流:只让一部分请求进入到后端处理,其他的直接尽早返回“秒杀已结束”之类的提示信息,从而减少后端并发读写的压力。
4.服务降级:可以将一些非重要功能服务进行降级处理,减少服务端的请求量。
如何控制绕过秒杀页面直接到下单页面提前下单?
在秒杀页面中引入一个 js 文件,js 文件中加入是否开始秒杀信息和下单页面 URL 的随机参数。在秒杀开始的时候生存一个新的 JS 文件,这个 JS 文件通过使用随机版本号的方式防止浏览器、CDN 等缓存。
评论