【架构师训练营】第九周作业:性能优化
作业一:
(至少完成一个)
请简述 JVM 垃圾回收原理。
1、如何识别出这个对象是垃圾?
通过可达性分析算法。
这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
在Java语言中,可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象。Student s = new Student();
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即一般说的Native方法)引用的对象。
2、常用的垃圾回收算法是什么?
标记-清除算法、复制算法、标记-整理算法、分代收集算法。
当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算
法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代
中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付
出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间
对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。
Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。
上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们
可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。
Serial收集器
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
Parallel Old收集器
CMS收集器
G1收集器
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
主要的挑战在于高并发、高可用。
1、画出现有的部署架构图,分析可能存在的问题
2、压测现有系统可承受的访问量,预估活动当天的访问量
3、思路:如果时间紧迫,性能需要提升很多倍,单纯加服务器已经不可能做到,这时不要硬碰硬,可以换个角度,从产品交互、设计、流程上进行优化。
4、解决高并发利器:缓存、限流、降级。
从列表页、详情页、下单页,越往后,可访问的人越少。
5、架构原则:4要1不要。在整个用户请求路径上从浏览器到服务端我们要遵循几个原则,就是要保证用户请求的数据尽量少、请求数尽量少、路径尽量短、依赖尽量少,并且不要有单点。
参考:
1、架构师训练营课程
2、如何设计一个秒杀系统 https://time.geekbang.org/column/article/40153
作业二:
根据当周学习情况,完成一篇学习总结
评论