架构师训练营第九章作业
作业一:请简述 JVM 垃圾回收原理
在年轻代中jvm使用的是Mark-copy算法,就像算法名字说的那样有两个步骤,第一是标记(Mark) 第二是copy(复制),Mark主要用于标记出还活着的实例,然后清除掉没有被标记的实例,释放内存,然后Copy部分则是将还活着的实例根据年龄拷贝到不同的年龄代。
对于标记 与区分年龄代的技术 我们一般都是用到的都是引用计数器,在每一个对象中都含有引用计数器,都有引用指向对象的时候 引用计数器就会加1,不在被引用 计数器 减 1,对与垃圾回收的策略则是标记所有活着的实例,将没有被标记的实例全部回收 释放内存,
对于静态,我们都知道静态方法与静态变量是不会产生实例的,直接通过类的引用,使用 ClassLoader进行加载的类数据如前面所说是不存在逻辑堆里面的,直接存在于永生代里面也就是 方法区里面,这个类一旦被清除掉里面所有的静态变量都会被清除。
当我们在 Object obj 的时候 向逻辑堆中的 Eden区域 申请内存,当Eden区域的内存不足的时候,这个时候会触发GC这个时候称gc为小型垃圾回收,每个实例都有一个独有的年龄,每个引用被经历过一次GC后就会年龄加一,同时就会将没有被清理掉的对象全都copy到survivor1区域。
当第二次GC执行的时候就会使用Mark算法找到存活的对象,然后将他们的年龄加1,并且将他们拷贝到survivor2区域,然后执行GC,这样就可以实现survivor1 与 survivor2 两个一样大的区域进行交替使用,当对象的年龄足够大的时候,对象就会被移动到老年代。
当GC被触发的时候 eden的对象会转到 survivor1 然后再次就会转到 survivor2 ,当survivor1的对象太大了 survivor2的区域无法容纳得部分就会转到Tenured的区域,当Tenured的区域也容不下的时候就会自动移动到年老代,在移动年老代的时候会先触发年老代上面的GC然后在将Tenured容纳不下的对象放入年老代。
作业二:设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
1、确定秒杀系统的用例场景
需要了解秒杀系统是给谁用的,什么样的人用这个系统?改如何去用这个系统?
2、确定量级规模
需要确定秒杀高峰期的并发数量,而且需要了解每秒处理的数据;
3、性能指标
需要确定高可靠性或者每笔数据的处理时间。
4、成本
需要考虑开发成本和运维成本,不能选择太偏的技术,而且需要适合公司的行情技术选型;
经过以上考虑数据库的并发量并不大,选用一般数据库即可;
压力主要是并发时的请求数;
1、会有大量的页面访问,我们需要把静态资源缓存到前端浏览器;
2、大量的数据查询我们可以使用分布式缓存比如redis,减少数据库访问,加快响应时间;
3、新增CDN中间访问层,大量的访问CDN层会将静态资源直接缓存;
4、大量的请求通过f5或者nginx分发到不同的服务;
5、nginx到流量网关进行鉴权和限流操作,每次请求通过网关记录到分布式缓存;
6、当网关接收到足够的样本,将其他的数据流量直接拦截直接返回;
7、安全方面需要考虑恶意刷单,我们需要校验用户token或者mac校验,而且要定订单时间做判断,需要判断用户重复提交;
8、当收集到足够的样本后需要算法就行淘汰机制,可以根据队列先进先出淘汰机制;
9、当锁定名额之前,前端按钮置灰,而且请求直接在网关拒绝,避免其他流量进入导致系统崩溃;
10、如果主备机,当大流量访问时系统宕机随时切换,并将数据同步至备机;
评论 (1 条评论)