垃圾回收原理及秒杀系统设计 -week9
一、垃圾回收原理
概念:垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
垃圾回收要解决的几个问题:
1.怎么知道哪些对象要回收 2.怎么回收 3.回收过程中的内存空间如何管理
1.JVM的垃圾回收
会执行如下两种方法
标记-清除法:
从根变量(线程栈中的局部变量,方法区中的静态变量)开始迭代遍历所有被引用的对象,对能够通过应用遍历访问到的对象都标记为“被引用”,标记完了后对那些未被引用的对象执行清除,对于“被引用”的对象,会进行压缩或复制的操作。
缺点: 每次启动都要或多或少的stop-the-world影响应用程序的使用
分代垃圾回收:
大多数的对象生命周期都比较短,将堆划分为新生代 和 老年代 两块空间,通常新生代的空间要远远小于老年代。

1.新创建的对象会保存在新生代,因大多数的对象生命周期都比较短,因此绝大多数的对象都会在新生代这里的young GC得到回收
2.随着新生代垃圾回收的持续进行,生命周期较长的对象会被最终提升到老年代中。
3.运行一段时间之后在Eden和From区To区都无法再转移的时候,就会进行一次全量的垃圾回收(FullGC)。
2.Golang
golang从1.5开始就采用了3色标记法,核心是将长时间的stop-the-world变为小段儿的stop the world。
过程描述:初始将所有内存标记为白色,然后将roots(stack、global vars指针)加入待扫描队列(进入队列即被视为变成灰色),然后使用并发goroutine扫描队列中的指针,如果指针还引用了其他指针,那么被引用的也进入队列,被扫描的对象视为黑色(不能gc)
二、秒杀系统设计
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
1.面临的挑战及解决
1.对现有网站业务造成冲击
秒杀活动只是一个附加活动,这个活动具有时间短,并发访问压力大的特点。
因此不能和现有的网站部署在一起,因为部署在一起了会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。
2.高并发下的应用,数据库负载
用户在开始前会进行不断的刷新页面以保证不错过秒杀,这些请求不能按照动态的网站来进行设计,要尽量的静态化,降低应用和数据库的负载
3.突然增加的网络及服务器带宽
假设商品页面200K(主要是图片的大小),那么需要的网络和服务器带宽是2G(200k*并发数),这些网络带宽是因为秒杀活动新增的,要超过网站的平时的带宽。
因此要考虑增加网络带宽,同时动静分离(将图片放到CDN)来减轻服务器的压力
4.直接下单
下单页面也是一个普通的 URL,如果得到这个 URL,不用等到秒杀开始就直接下单了。这样是不行的,因此要将这个URL变成携带随机变量的形式。
2.核心的架构方案

1.页面动静分离(将图片放到CDN)来减轻服务器的压力
2.增加临时带宽
3.下单页面URL动态化,在开始时才输出给客户端
4.设计一个阀门用于点击"秒杀商品"按钮后的计数器,计数器的逻辑如下图,计数器的目的是为了放过允许的流量请求。

评论