架构师培训第 9 周习题
1、请简述 JVM 垃圾回收原理。
JVM 垃圾回收就是将 JVM 堆中不在使用的对象清理掉,是否宝贵的资源。
JVM 通过一种可达性分析算法进行可回收对象的识别。具体过程是:从线程帧中的局部变量或者是方法区中的静态变量出发,将这些变量引用的变量进行标记,然后看这些变量是否引用了其他变量,继续进行标记,所有被标记的对象都是被使用的对象,而那些没有被标记的对象就是可以被回收的垃圾对象了。
进行标记完以后,JVM 就会对被垃圾对象占用的内存进行回收,回收主要有三种方法。
清理:将垃圾对象占用的内存清理掉,其实 JVM 不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创建新对象的时候,就从空闲列表中找一块空闲内存分配给这个新对象。
压缩:从堆空间的头部开始,将存活的对象拷贝到一段连续的内存空间中,那么其余的空间就是连续的空闲空间。
复制:将堆的空间分成两部分,只在其中一部分创建对象,当这部分空间用完时,将标记过的可用对象复制到另一个空间。
2、设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案和思路有哪些?
(一)面临的问题和挑战
(1)瞬间高并发,对现有网站业务必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。
(2)秒杀前,用户通过不停刷新页面以保证不会错过秒杀,这对后台的服务器,数据库造成很大压力。
(3)高并发,商品图片传输量大,对网络带宽造成很大的压力。
(4)防止用户秒杀未开始之前,获取下单页面,直接下单购买商品,导致秒杀活动直接结束。
(5)购买按钮在秒杀活动开始之前必须处于不可点击状态。
(二)核心架构方案和思路
(1)将秒杀系统独立开发,独立部署,使用独立域名,使其与网站完全隔离,防止对现有业务的冲击。
(2)重新设计秒杀商品页面,不使用网站原来的商品详细页面,页面设计保持简单,使用 JS 自动更新技术将动态页面转换为静态页面,用户刷新商品页请求不需要经过应用服务。
(3)三道阀门,进行并发控制,第一道阀门只允许一部分请求进入秒杀页面,第二道阀门只允许通过第一道阀门的一部分人进入下单页面,第三道阀门只允许通过第二道阀门的一部分人进入支付系统,其他人只看到秒杀结束页面。
(4)租用 CDN,将图片、静态页面存放在 CDN 上,降低网络带宽的压力。
(5)为了避免用户直接访问下单页面 URL,需要将改 URL 动态化,下单页面 URL 加入由服务器端生成的随机数作为参数,在秒杀开始的时候才能得到。
(6)使用 JavaScript 脚本控制,在秒杀商品静态页面中加入一个 JavaScript 文件引用,该 JavaScript 文件中包含随机生成的一些随机数,每个随机数对应一个秒杀商品按钮,控制秒杀是否开始,按钮是否置灰。
评论