写点什么

架构师训练营 W9 作业

用户头像
Kun
关注
发布于: 2020 年 08 月 05 日
架构师训练营 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、一旦请求异常或出错,直接跳转秒杀失败界面


发布于: 2020 年 08 月 05 日阅读数: 46
用户头像

Kun

关注

Life is short. 2018.01.13 加入

Software Developer

评论

发布
暂无评论
架构师训练营 W9 作业