写点什么

极客时间 - 架构师培训 - 9 期作业

用户头像
Damon
关注
发布于: 2020 年 08 月 02 日
极客时间 - 架构师培训 - 9 期作业

问:

1. 请简述 JVM 垃圾回收原理。

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


答:

  1. JVM 垃圾回收主要分成 4 个方面。第一个方面,如何标记垃圾;标记算法主要有 2 个,引用计数算法和可达性分析算法。前者在对象被使用时计数器加一,不使用时计数器减一,如果计数器为 0 则认为是垃圾,但是会有循环引用的问题。后者通过对象能否到达根对象来判断,对象是有引用链的,通过引用链查找根对象,如果不能则认为是垃圾。根对象指的是存在栈或者方法区中的对象。第二个方面垃圾回收基本算法,主要有清除,拷贝和压缩。清除就是把标记出来的垃圾直接清除掉,效率高但是会产生很多碎片。拷贝是将内存一分为二,每次只用一半,回收时将没有标记为垃圾的拷贝到另一半,效率也不错,而且没有碎片,但是内存利用率低。压缩则是结合了上述两种算法,即将未标记为垃圾的对象向头部拷贝,尾部则留出连续的可用内存;第三个方面 JVM 为了优化效率设计了分段策略,因为考虑到具体的使用场景,尤其是互联网 web 应用,大部分对象的生命周期都很短,所以可以分为新生代和老年代,新生代又分为 Eden 区和 From 区还有 To 区,它们的比例是 8:1:1,新创建的对象都是先进入 Eden 区,满了就带上 To 区中未标记为垃圾的对象一起拷贝到 From 区,然后清空 To 区,如果下次 Eden 又满了,则带上 From 区未标记为垃圾的对象一起拷贝到 To 区,如此反复,当然如果 From 区或者 To 区不够了则直接进入老年代,如果老年代也满了则会进行 FullGC,此时性能消耗就大了;第四个方面是垃圾回收器。主要有 SerialNew SerialOld(串行复制整理),ParNew ParOld(并行复制整理,侧重响应时间),Paraller Scavenge(并行复制,侧重吞吐量),G1(并行复制整理,没有垃圾碎片,性能稳定,可以控制停顿时间),CMS(并行清楚,高并发,低停顿,但容易产生垃圾碎片,特殊情况容易不断进行垃圾回收,不稳定)等。

  2. 主要的挑战有高并发(并发人数突增,带宽压力,服务器压力)和秒杀器(不停发送请求,在开始前获得下单的页面,提前抢购了商品)。应对上面的问题主要的思路是限流,动态页面转静态,砍掉不必要的请求,活动真正开始时才给前端返回下单页面,以及针对秒杀的特性优化系统架构。具体的方案有限流三重门,通过在关键请求上设置计数器,只让靠前的一部分用户进入最终的下单流程,而这些流量在系统正常情况下就能处理,就化解了高并发对服务器的压力。前端通过拉取静态服务器的静态页面展示,并搭配 CDN,让大量的静态请求停留被拦在业务服务器之前,减少服务器压力也提升用户响应速度。砍掉原本正常流程中无关紧要的分支流程,保住核心秒杀业务。下单成功即可反馈用户,无需进入付款流程,付款在 1 天内完成即可。活动开始前不返回参与秒杀的商品 ID,开始后才返回并带上下单链接(通过动态 token 来验证是否有效),前端通过校验是否返回了商品 ID 来判断秒杀是否开始,未开始时秒杀按钮置灰。对系统各环节使用的技术深度分析,并进行优化,比如 JVM 调优等。

用户头像

Damon

关注

还未添加个人签名 2019.07.22 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
请添加“极客大学架构师训练营标签”,便于分类~
2020 年 08 月 03 日 14:22
回复
没有更多了
极客时间 - 架构师培训 - 9 期作业