架构训练营第九周作业
作业一:
第一题
请简述 JVM 垃圾回收原理。
解答:
垃圾回收,就是将 JVM 堆中不在使用的对象清理掉,释放内存资源
算法:
JVM 的垃圾回收,主要依靠可达性分析算法。从线程栈帧中的局部变量,或是方法区的静态变量出发,对这些变量引用到的对象进行标记。然后把第一步标记的对象作为出发点,去标记那些被这些对象引用到的对象。反复重复此过程,直到所有能到达的对象都完成标记。剩下的没有标记的对象就是可回收的垃圾对象了。
回收分类:
清理
压缩
复制
真实使用中,很少使用清理,因为清理垃圾对象得到的空间多是分散的碎片空间,无法容纳新创建的对象。
压缩的方法,会将仍然在用的对象全部“挤”到一起,把剩余空间化零为整,方便创建新对象。
复制的方法,会将堆分成两块,把仍然在用的对象全部放入一块,然后在另一块存放新创建的对象。
分代垃圾回收:
大的层面上,堆被分为两部分,新生代一部分,老年代一部分。新生代又分成了 Eden,From,To 3 个区。
新创建的对象放入 Eden 区,当该区空间不够时,进行新生代垃圾回收(Young GC),把仍然存活的对象放入 From 区。下一次垃圾回收,把仍然存活的对象放入 To 区。来回的在 From 和 To 间移动。当几次在 From,TO 间来回移动之后,如果仍然有对象存活,将这些对象放入老年代。老年代空间会比较大。
如果老年代也满了,也需要做垃圾回收,而新生代同时也做垃圾回收。这时垃圾回收属于完全垃圾回收(Full GC)
JVM 垃圾回收器算法
串行回收器
最早的时候,由于硬件条件(CPU 单核),垃圾回收是一个线程串行进行的,每次进行 GC 时,所有进程都停止响应(Stop the world)。
并发回收器
到了多核时代,垃圾回收也开始使用多个线程并发回收的方式。这样就能大大减少 Stop the world 时间。
并行回收器 CMS
并发回收的时候,仍然会 Stop the world。为了改善响应时间,开始使用并行回收器。回收分为几个阶段:初始标记,并发标记,重标记,并发清理。 初始标记还是会 Stop the world,但时间大大减少;然后进入并发标记过程,这里的并发指垃圾回收标记线程和用户线程并发执行;这样的话带来另一个问题,就是并发标记时,用户线程可能会产生新的垃圾。所以需要下面的重标记过程。该过程也需要 Stop the world;最后时并发清理,这里的并发也是指垃圾清理线程和用户线程并发执行。
因为并发标记,并发清理时用户线程依然可以正常执行,所以整个过程看下来,用户被 Stop the world 阻塞的时间就减少了。
G1 回收器
现在比较主流的回收器。
把内存分为很多小块区域,针对小块区域进行 GC。各个小块也分角色,Eden,Survivor,Old,Humongous 等。
可以设置-XX:MaxGCPauseMillis 参数,指定 Stop the world 时间,回收机制会动态调整策略,满足设置的时间(时间设置需要合理,否则也没有效果)
第二题
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
解答:
挑战和问题
秒杀系统会带来平时百倍千倍的并发访问量,而通常企业现有的硬件资源是远远不够支撑这么高的并发访问量的。
需要防止用户跳过页面直接下单。
秒杀活动通常卖的商品都会十分抢手,所以会有用户使用秒杀器、机器人等进行抢购。所以需要相应的预防措施。
架构方案
资源准备
可以临时征用一些备用的、冗余的服务器进行支撑
提高带宽上限来支持秒杀活动
使用 CDN,事先缓存肯定会成为热点的图片等静态资源
隔离
构建新系统,而不是在老系统上改造或扩展。
新系统更容易上手,并且不会把风险带入老系统。
阀门设计
通过多层阀门,一层层的将并发量控制在合理、可接收范围。超过阀门阈值的请求,直接进入万能的“秒杀已经结束”页面,可以大大减少并发压力。
设计优化
静态化:把动态页面变为静态页面
并发控制:仅允许最前面一部分人进入秒杀系统
简化流程:砍掉不必要的分支流程
前端优化:使用 YSLOW 的技术提高页面响应速度
预防秒杀器:URL 带随机 token 参数,秒杀前 2 秒生成,设置访问上限等
作业二:
根据当周学习情况,完成一篇学习总结
解答
请看下面的脑图
版权声明: 本文为 InfoQ 作者【一期一会】的原创文章。
原文链接:【http://xie.infoq.cn/article/dc1c41b8185af895e0d2f8c37】。文章转载请联系作者。
评论