写点什么

垃圾回收原理及秒杀系统设计 -week9

用户头像
Lane
关注
发布于: 2020 年 08 月 05 日

一、垃圾回收原理

概念:垃圾回收(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.设计一个阀门用于点击"秒杀商品"按钮后的计数器,计数器的逻辑如下图,计数器的目的是为了放过允许的流量请求。



用户头像

Lane

关注

还有梦想 2018.07.05 加入

还未添加个人简介

评论

发布
暂无评论
垃圾回收原理及秒杀系统设计-week9