架构师训练营 W9 作业
请简述 JVM 垃圾回收原理。
JVM 垃圾回收主要针对的是内存模型中堆内存和少量方法区内存的回收。并通过可达性分析算法来判断对象是否可以被回收。
堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区, Survivor 由 From Survivor 和 To Survivor 组成。
JVM 在分配对象上首先使用 Eden 和 From Survivor,在发生垃圾回收的时候将存活的对象直接复制到 To Survivor,然后清除 Eden 和 From Survivor,第二次分配时使用 Eden 和 To Survivor 区域,回收时将存活对象复制到 From Survivor,清除 Eden 和 From Survivor 区域,如此交替使用。
默认 Eden 和 From Survivor,To Survivor 大小按 8:1:1 分配,所以当存活对象越来越多,Survivor 无法存放下的时候,就将对象移动到老年代中。等老年代中对象也存不下的时候就将发生一次老年代对象回收(FullGC),JVM 首先标记无效的对象,然后再将存活对象集中起来,确保内存空间不至于碎片化。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
问题主要出现在
1、网络带宽使用高
2、秒杀时并发数非常高
3、业务过程中某个环节出现瓶颈后容易引起连锁反应
4、不能出现提前秒杀情况,影响恶劣
所以总体思路是减少业务流程环节,并且把请求尽量拦截在上流,减少数据库压力。
具体来说
前端
1、 对商品详情页面进行静态化,通过 CDN 缓存和本地浏览器静态资源缓存,减少应用服务器连接数及带宽使用。
2、 通过在秒杀前提供 JS 文件控制用户提前拿到请求进行秒杀。
后端
1、 对请求进行分阶段限流,一旦超过后直接返回秒杀失败。后续“提交购买”亦然,确保在访问数据库之前减少大部分请求。
2、 通过消息队列等手段分散瞬时的高并发请求。请求调用之间尽量采取异步非阻塞。
最好应急预案
1、单独域名及服务器,最低程度不能影响原有系统
2、一旦请求异常或出错,直接跳转秒杀失败界面
版权声明: 本文为 InfoQ 作者【Kun】的原创文章。
原文链接:【http://xie.infoq.cn/article/0f13edc952d07a0bc9d1516ec】。未经作者许可,禁止转载。
评论