「架构师训练营」作业:第 9 周
请简述 JVM 垃圾回收原理。
JVM 垃圾回收就是将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。
JVM 通过一种可达性分析算法进行垃圾对象的识别:
从现场栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记
然后看这些被标记的对象是否引用了其他对象,继续进行标记
所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。
JVM的垃圾回收方法有三种,分别是
清理:将垃圾对象占据的内存清理掉
压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空间就是连续的空闲空间。
复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。
在分代回收算法中,会根据对象的存活周期,将内存划分为几块,一般是新生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation)。这样就可以根据不同内存区域的特点执行采用不同的回收算法。
JVM 垃圾回收算法的发展经历了这 4 个阶段:串行回收器、并行回收器、并发回收器 CMS、G1回收器。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀是将少量商品(通常只有一件)以极低的价格,在特定的时间点开始销售的一种营销活动。
高并发情况下,秒杀系统将会遇到以下问题:
网络带宽耗尽
服务器 Load 飙高,停止响应
数据库瘫痪
一个秒杀系统 一般由秒杀商品列表、秒杀商品介绍、下单页面组成。设计秒杀系统建议遵循以下原则:
静态化
采用 JS 自动更新技术将动态页面转化为静态页面,秒杀商品 list 和 Detail 是静态 HTML 页面。
并发控制,防秒杀器
设置阀门,只放最前面的一部分人进入秒杀系统。
简化流程
砍掉不重要的分支流程,入下单页面的所有数据库查询。以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。
前端优化
采用 YSLOW 原则提升页面响应速度
除了以上设计原则外,还要准备应急预案:
域名分离,独立域名,不影响原有业务
机动服务器备用
拆东墙不西墙战略,下线非核心应用集群的冗余服务器,加入到秒杀集群
壁虎断尾策略,所有办法均失效的情况下,非核心应用集群统统停止服务,保证核心应用的可用性。
万能出错页面:秒杀活动已结束,任何出错都 302 跳转到此页面。
评论