写点什么

架构师 3 期 3 班 -week9- 作业

用户头像
zbest
关注
发布于: 2021 年 01 月 22 日

作业题目

  • 请简述 JVM 垃圾回收原理。

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


作业 1


简述 JVM 垃圾回收原理


堆中分为新生代与老年代,垃圾回收也是独立的。

垃圾回收主要 4 种算法:标记-清除、标记-压缩、复制和分代

JVM 使用分代回收策略,新生代的垃圾回收叫 MinorGc,老年代的垃圾回收叫 MajorGc


MinorGc

不考虑栈上分配的情况下,创建对象会在新生代中的 eden 区分配一块内存

当 eden 区满候触发 MinorGc

  1. 根据 GCRoots 的可达性分析,标记哪些对象还在被引用

  2. 将 eden 区和 s0(form)区被标记为还在用的对象,复制到 s1(to)区

  3. 将存活的对象生存年代计数+1

  4. 如果有对象存活年代超过 16(默认),将这个对象移入老年代

  5. s0 与 s1 逻辑对换,s0 从 form 区变成 to 区,s1 从 to 区变成 form 区

  6. 完成 MinorGc


MajorGc

老年代的对象主要来自 survivor 晋升(超过 16 代或者 survivor 满了提前晋升)和新创建大对象(通过-XX:PretenureSizeThreshold 参数指定)


当老年代满了时,触发 MajorGc

  1. 根据 GCRoots 的可达性分析,标记哪些对象还在被引用

  2. 清除未标记的老年代对象(具体用标记-清除/标记-压缩算法用的垃圾回收器)

  3. 完成 MajorGc


新生代与老年代一起进行垃圾回收叫做 FullGc

通常 MajorGc 会伴随 MinorGc,所以通常可以认为 MajorGc = FullGc


作业 2

秒杀系统的挑战


  • 高并发带来的带宽压力(图片、css、js 等静态资源)

  • 高并发带来的服务器系统资源压力(cpu、内存、文件句柄等)

  • 数据库 IO 压力

  • 秒杀器


解决思路

秒杀的解决方案是系统化的,不是只解决/优化一个或几个点,而是从前端到后端,从硬件到软件,从需求到测试开发的全面思考


硬件方面

1. 隔离:秒杀系统与正常的系统隔离,避免秒杀的高流量影响正常业务

2. 资源:预算内更多的服务器、更大的内存、更快的硬盘、更高的带宽

3. CDN:静态资源放到 CDN,热单页面可以提前预热


软件架构

1. 利用缓存降低数据库的 IO

2. 利用 mq/异步/队列提高吞吐量

3. 动静分离提高服务器访问性能

4. 非核心业务降级

5. 限流(IP 限流防刷,多级页面限流减少服务器压力)

6. 客户端缓存(热点数据如秒杀列表等缓存到客户端一段时间避免刷新)


需求沟通

实际操作中,可以从需求出发,引导产品经理对需求做一些调整,可以更省时省力的解决大问题,这是实际工作中的个人心得,不一定正确。


能否加入人机识别

点抢购时,加入拖块也好,识别文字数字也好,加入这种用户操作一是可以防止秒杀器,二是可以有效减少瞬时并发,起到客户端消峰的效果。

缺点是用户体验稍差,需要产品经理确认是不是认可


能否将秒杀变成抽奖

类似 nike 发布新鞋的时候,15 分钟之内可以预定,到时间揭晓是否获得购买资格,这也是一种变相的秒杀,而且能有效的防止秒杀器/黄牛党,是个蛮不错的思路。预定无需操作数据库,直接记录缓存服务器即可,性能好很多。


发布于: 2021 年 01 月 22 日阅读数: 28
用户头像

zbest

关注

一个胖子 2020.11.04 加入

一个不正经的java程序员, 整天写着openresty和go的代码, 努力从键摄向非职业摄影师迈进, 快要溺死在内耗里的中年人, 胖子。

评论

发布
暂无评论
架构师 3 期 3 班 -week9- 作业