9-1 垃圾回收原理和秒杀系统
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,所有库存读写都在内存中,然后通过队列等异步方式将变化的数据写入数据库。
版权声明: 本文为 InfoQ 作者【burner】的原创文章。
原文链接:【http://xie.infoq.cn/article/50708b813290b8be44d052ec4】。未经作者许可,禁止转载。
评论