写点什么

WORK-09-JVM 回收和秒杀系统设计

用户头像
蒜泥精英
关注
发布于: 2020 年 08 月 05 日
WORK-09-JVM回收和秒杀系统设计

JVM 垃圾回收原理


回收的目的:

JVM 来及回收就是将 JVM 堆中已经不再使用的对象清理掉;释放宝贵的内存资源;


JVM 通过一种可达性分析算法进行垃圾对象的识别;

在线程栈以及静态区中,从根对象开始逐层找被引用的对象,对被引用的对象进行标记;未被标记的就回收或压缩;


回收的方式有三种手段:

(1)清理

把垃圾对象清理掉,实际上就是把这个区域标记下,然后后面新的数据直接覆盖掉;

(2)压缩

从堆的头部开始,通过 COPY 可以把有数据的空间合并,让空闲的空间变成连续的空间;

(3)复制

直接把数据 COPY 到另一个快空间;


JAVA 分代垃圾回收:

JVM 的空间分新生代和老年代,通常新生代区比老年代区小很多;

对象的生命周期一般都比较短,很快就会被回收;一直使用的对象会放到老年代;

一个对象一创建就放入新生代,新生代比较小;如果新生代满了,就会触发一次对象回收,此时大部分对象都会被回收,这样回收效率会比较高些。

新生代又包括了 Eden 区、From 区和 To 区,当 EDEN 区满了就触发一次全量回收(young GC)

此时,如果还有被引用的对象 COPY 到 FROM 区;EDEN 区再次使用满了,把 EDEN 和 FROM 区的标记对象 COPY 到 TO 区;再次 EDEN 区满了,就会把 EDEN 区和 TO 区 COPY 到 FROM 区;多次 FROM 和 TO 区来回复制,这些对象还没有被回收,那么这些对象就会进入老年代区;

如果成行运行一段时间后,都不能 COPY 到 FROM 区,那么就会触发一次 FULL GC 。


垃圾回收的计算法

串行垃圾回收器

当内存不够,停掉全部应用程序的线程,然后只启动一个线程,进行垃圾回收;

STOP THE WORLD ,只有一个线程在回收,用户请求都不会处理;


并行垃圾回收器

当内存不够,停掉全部应用程序的线程,然后启动多个线程,进行垃圾回收;

还是会 STOP THE WORLD ,只是回收的线程多了,用户请求都不会处理;


并发垃圾回收器 CMS (早期应用的比较多些)

启动线程标记根对象,然后并发标记 ,这时应用线程和垃圾回收线程并行执行;

接着进行 STOP THE WORLD 进行重标记,这个时候应用线程会暂停,但是这个时间比较短;


G1 垃圾内存回收管理

将一个内存空间内分成很多个块,不同的块设置不同的角色,有 EDEN 区,SURVIVOR OLD HUMONGOUS

这样按块来回收,效率会比较高些。


设计一个秒杀系统

设计一个秒杀系统,主要的挑战和问题有哪些?核心架构方案或者思路有哪些?


面临的挑战:


瞬间的高并发对网站性能的影响:

(1)高并发下:图片过大,导致带宽耗尽,

(2)高并发下,对数据库的 IO 性能影响,甚至 REDIS 或 MYSQL 的崩溃;

(3)高并发下,对业务处理响应时间的影响,类似 DDOS 攻击;


解决思路:

1、秒杀模块和现有业务模块解构,防止秒杀模块崩溃影响现有业务功能;

2、简化秒杀模块的界面采用静态化

关键点 1:页面可配置,通过设置定时器,将静态页面提前生成推送到静态资源服务器,再控制图片大小;

关键点 2:秒杀商品列表/秒杀商品介绍页面,如何判断秒杀开始否?

商品 ID 从后台获取,通过商品 ID+TOKEN 来判断是否开始;

3、并发控制,防秒杀器:

三道阀门的设计

分布式缓冲,三个计数器;

计数器 1:限制进入秒杀界面; ---所有的压力在这个界面就处理掉了,到下个界面压力就降了;

计数器 2:限制进入下单页面;

计数器 3:限制进入支付系统;


4、简化流程:

高并发的秒杀过程不直接操作数据库


5、其它底线保障

应急预案:独立域名,不影响 XXX 原有业务

机动服务器;服务降级;

万能出错页面;


用户头像

蒜泥精英

关注

还未添加个人签名 2018.09.19 加入

还未添加个人简介

评论

发布
暂无评论
WORK-09-JVM回收和秒杀系统设计