写点什么

9-1 垃圾回收原理和秒杀系统

用户头像
burner
关注
发布于: 2020 年 08 月 06 日

1。垃圾回收原理

1)GC 是一种自动管理内存的计数,用来回收 heap 中不再使用的对象。

内存在运行中划分为多个区域,常见的是 stack 和 heap,栈空间一般比较小,在函数调用过程中用以分配入参和局部变量,在函数结束时自动回收,不涉及 GC

heap 一般较大,可在多个函数间共享数据。程序可根据需要进行动态申请,GC 主要工作在 heap。

2)GC 常用策略

tracing 追踪:JVM,Go,.NET;引用计数:Python,PHP,Perl,Obj-C

3) Tracing

这类 GC 从某些 ROOT 对象开始,不断追踪可以被引用的对象,这些对象被称为可到达 reachable

其他剩余的称为不可到达 unreachable,将被回收。

一般来说可到达对象包含:Root 对象(全局变量,调用栈上的对象);从 Root 对象开始,间接引用的对象;

劣势:STW - 只能通过各种措施优化,减少 STW 时间(incremental/concurrent GC)

4)引用计数类 GC 会记录每个对象的引用次数。当引用次数为 0,就被回收,实现简单。

和追踪类比优势:

可以保证引用为 0 立刻被清理,无不确定性;

大多数操作具有增量特性,GC 与应用交替运行,不需暂停应用即可完成回收;

劣势:

无法解决循环引用,CPython 使用独特的环检测算法规避,也可以用弱引用方式解决

实现一个高效的引用计数比较困难。


总的来说,追踪类的效率更高,其变种也比较多。


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

秒杀系统主要的挑战是:

1)高并发下对系统的冲击;

2)突然增大的流量和带宽压力;

3)对下单流程的压力



核心思路:

前端:扩容,限流,静态化;

1)秒杀系统独立部署,减少对其他业务的影响;

2)秒杀系统页面静态化,减少对业务的访问;

3)租借专用带宽和 CDN

4)动态生成随机下单页面 URL

后端:内存,排队

将库存从 MySQL 提前移到 Redis,所有库存读写都在内存中,然后通过队列等异步方式将变化的数据写入数据库。


发布于: 2020 年 08 月 06 日阅读数: 60
用户头像

burner

关注

还未添加个人签名 2018.08.07 加入

还未添加个人简介

评论

发布
暂无评论
9-1垃圾回收原理和秒杀系统