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 原有业务
机动服务器;服务降级;
万能出错页面;
评论