架构师训练营第九周作业

用户头像
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 日 阅读数: 20
用户头像

sunnywhy

关注

还未添加个人签名 2019.04.25 加入

还未添加个人简介

评论

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