第九周作业
jvm 垃圾回收原理是什么?
答:1)jvm 判断对象是否应该回收是通过可达性分析来操作的,从 roots 往下顺路搜索,如果有一条可达路径,那么就是可达的,就不应该回收;2)jvm 将堆分为新生代、老年代。其中新生代又分为 eden,s0,s1 区,新生代因为对象存活周期短,所以一般使用复制算法;在多次 young gc 之后,新生代活下来的对象在达到一定的年龄之后就会挪到老年代;当老年代的空间不足的时候,就会进行 full gc,老年代有多种垃圾回收处理器,例如串行收集器、并行收集器、cms 收集器和 g1,主要目的都是为了节省「stop-the-world」的时间,其中 cms 收集器使用的是 mark-sweep 的算法,只是标记哪些内存块应该清除,但是并不挪动,所以最后会有大量的内存碎片,但是 cms 收集器的用户响应时间较好。还有使用 mark-compact 的算法的垃圾回收器,该算法会将存活的对象全部挪到一边去,减少内存碎片的产生。其中 g1 垃圾回收器是将堆分为多个块,对每个块进行 mark-compact 算法。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
主要的挑战:瞬时并发流量高,会造成带宽、数据库以及 CPU 的 load 变高,从而因为某个环节挂掉,使得整个系统崩溃;
主要的问题:除了自然用户流量,还有重复刷新和脚本带来的流量
核心的架构思路:
1)要隔离,秒杀系统即使崩溃了,也不能影响到现有的系统;
2)解决带宽问题,首先要利用 cdn,同时还要压缩 css、js 文件;
4)解决大量流量瞬时涌入的问题,主要思路是限流,防止系统被瞬时的大流量击垮,用户提前点击预订等按钮,获取到有效的 token,有这些 token 的用户才能继续进入到下一步中;
5)解决查询数据库的问题,秒杀列表和秒杀详情等页面本来是要查询数据库来反映实时的数据的,我们使用静态化页面的方式,不访问数据库,这样就可以减少数据库的压力;
6)解决插入、更新数据库的问题,秒杀下的单可以考虑用 redis 来存储下的单,只有支付了之后才会进入到最终的数据库;
7)隐藏产品的 id 和下单的 url,只有当秒杀系统要开始的时候才开始推送。
评论