写点什么

架构师训练营第九周作业

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

作业一:请简述 JVM 垃圾回收原理。


要了解 JVM 垃圾回收,得先从 JVM 的内存模型谈起,内存中分为四个不同的区,其中栈和程序计数器是线程独享的,方法中的基本类型以及对象的引用都存储在栈中,程序计数器用来记录当前线程执行到方法中的哪一行,可以用于线程切换时恢复方法执行。剩下的 meta 区跟 heap 区则是所有线程共享的,meta 区存储 java 类元信息以及静态变量,所有通过 new 关键字创建的对象则存储在 heap 区。


垃圾回收主要是指对 heap 区的回收,JVM 主要使用的方法是分代回收,将 heap 分为新生代和老年代分别回收。原因是大部分对象的生命周期很短,可以在新生代内回收掉,这叫做 Young GC, Young GC 的时候会将所有存活的对象进行压缩,放入 Survior 区。当对象在经历多次 Young GC 后仍然存活,则会进入老年代。放入老年代时如果空间不足,则会触发老年代 GC,叫做 Full GC。


那么 JVM 是如何判断对象是否应该被回收呢?主要是通过可达性标记来实现的,通过使用所有线程栈中对象引用作为根,来递归的查看还有哪些对象被引用着,这些对象被标记为可达对象。反之,哪些不可达的对象占用的内存则可以被回收。


JVM 的垃圾回收有不同的算法,常见的串行,并行,标记并清理,和 G1。串行算法是最初的方式,是由于当时的 CPU 只有一个核心导致的,多核时代自然发展出了并行算法,标记清理是把过程分为了两步,先标记好可达对象,最后再统一清理(为了减少 Stop the world 的时间,提高并发和缩短响应时间)。G1 是为了更进一步的减少 stop the world,分成更多不同的小区来进行回收。


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


秒杀系统的主要挑战一是大量用户在同一时刻点击某一服务,并发量巨大, 超出正常设计的网络能力、应用服务器能力和数据库能力。二是安全性,秒杀链接不能提前泄露或易于猜测,否则一旦有人可以在秒杀开始前下单,将给公司造成巨大损失。


思路如下:

  • 单独设计秒杀应用,与原系统分开,使用独立子域名,这样在最坏的情况下,即使秒杀系统承受不住压力而崩溃,也不用影响原系统。

  • 引导用户提前登陆,不要把秒杀压力扩展到登陆模块,可以增加用户 session/token 的有效时间。

  • 因为秒杀商品有各种图片,而图片则非常消耗带宽,在高并发的情况下,会使得带宽耗尽而无法响应请求。最好的方式是将图片,css,js 等静态资源,使用 CDN 缓存,CDN 可以租借也可以直接使用云厂商提供的服务。即使有 CDN,还是应该将静态资源单独设置服务器,避免影响应用服务器。

  • 应用服务器设置集群,提升并发能力,同时使用反向代理,保证静态资源和动态资源路由到正确的服务器上。

  • 关键中的关键是设置阀门,针对商品页面,下单页面,和付款页面设置不同的阀门,逐级减少并发数,当并发超过阀门设置时,自动返回一个秒杀结束的静态页面。这样,一般应用服务器只需要抗住商品页面的并发数就行,下单和付款的并发,原有的系统就可以处理。

  • 另外,不要忘记秒杀链接的安全性,可以通过后端的定时任务在秒杀开始前的 1 分钟来生成链接或者认证 token。

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

sunnywhy

关注

还未添加个人签名 2019.04.25 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周作业