写点什么

架构师训练营 - 第九周 - 作业

用户头像
韩挺
关注
发布于: 2020 年 08 月 04 日

请简述 JVM 垃圾回收原理。

以java8为例,Jvm垃圾回收主要针对的是内存模型中堆(heap)内存和少量方法区内存的回收。并通过可达性分析算法来判断对象是否可以被回收。

堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区, Survivor 由 From Survivor 和 To Survivor 组成。

Jvm在分配对象上首先使用Eden和From Survivor,在发生垃圾回收(MinnorGC)的时候将存活的对象直接复制到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、 对请求进行分阶段限流,比如“拿到购买资格”,可通过redis计数器限定个数,一旦超过后直接返回秒杀失败。后续“提交购买”亦然,确保在访问数据库之前减少大部分请求。

2、 通过消息队列等手段分散瞬时的高并发请求。请求调用之间尽量采取异步非阻塞。

最好应急预案

1、单独域名及服务器,最低程度不能影响原有系统

2、一旦请求异常或出错,直接跳转秒杀失败界面

 

用户头像

韩挺

关注

还未添加个人签名 2019.01.25 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
作业请添加”极客大学架构师训练营“标签,便于分类查找~
2020 年 08 月 05 日 14:11
回复
没有更多了
架构师训练营 - 第九周 - 作业