第九周 性能优化(三) 作业 「架构师训练营 3 期」
JVM 回收原理
一、分代收集理论
目前大多数 JAVA 虚拟机都遵循了“分代收集”的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则。
根据对象的存活周期的不同将内存分为几块,分别为新生代、老年代和永久代。
新生代:朝生夕灭的对象(例如:方法的局部变量引用的对象等)。
老年代:存活得比较久,但还是要死的对象(例如:缓存对象、单例对象等)。
永久代:对象生成后几乎不灭的对象(例如:加载过的类信息)。
二、具体算法有哪些
1、标记-清除算法
“标记-清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。
它的主要缺点有两个:
(1)效率问题:标记和清除过程的效率都不高;
(2)空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,碎片过多会导致大对象无法分配到足够的连续内存,从而不得不提前触发 GC,甚至 Stop The World。
2、标记-复制算法
为解决效率问题,“复制”收集算法出现了。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
它的主要缺点有两个:
(1)效率问题:在对象存活率较高时,复制操作次数多,效率降低;
(2)空间问题:內存缩小了一半;需要額外空间做分配担保(老年代)
From Survivor, To Survivor 使用的就是复制算法。老年代不使用这种算法,
3、标记-整理算法
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费 50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都 100%存活的极端情况,所以在老年代一般不能直接选用这种算法。
根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4、分代收集算法
GC 分代的基本假设:绝大部分对象的生命周期都非常短暂,存活时间短。
“分代收集”算法,把 Java 堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
部分内容来源:https://blog.csdn.net/wuzhiwei549/article/details/80563134
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
一、主要的挑战和问题
1、网络
大量同时请求,会造成网络带宽占用过高
2、数据库
高并发访问数据库,给数据库带来巨大压力
3、服务器响应
服务器资源不足可能不能承受较大并发访问
4、高并发
高并发带来的挑战
5、秒杀器
秒杀机器人之类的工具会加大并发压力
二、核心的架构方案或者思路
1、静态资源使用 cdn 服务、图片压缩避免使用大文件
2、动态页面生成为静态页面
3、并发控制,防秒杀器,只放一部分人进入秒杀系统
4、简化查询到下单到付款的流程,流程环节越少,占用资源越少,可以降低压力
5、控制秒杀操作时间,只有在时间到了的时候才可以点击操作,秒杀结束后停用秒杀操作
6、减少 http 请求量,减少 cookies 的量,css、js 能压缩的尽量压缩
7、减少访问数据库的频次
评论