架构师训练营第九周作业
作业一:
请简述 JVM 垃圾回收原理。
JVM的自动内存管理最核心的功能是堆内存中对象的分配与回收。Java的堆空间基本结构如下:
JVM的堆可细分为新生代和老年代,其中新生代又可以划分为Eden 空间、From Survivor、To Survivor 空间等,进一步划分的目的是为了更好的回收内存或者更快的分配内存。
堆内存常见的分配策略如下:
对象优先在eden区分配,因为大多数对象是朝生夕死的。
大对象直接进入老年代,避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。
长期存活的对象将进入老年代,如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1.对象在 Survivor 中每熬过一次 MinorGC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数
-XX:MaxTenuringThreshold
来设置。
常见的垃圾回收算法:
标记清除算法
该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。
存在的问题:可能产生大量的内存碎片。
复制算法
将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收
标记整理算法
根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法
根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
常见的垃圾收集器:
serial收集器,新生代采用复制算法,老年代采用标记-整理算法。
ParNew收集器,新生代采用复制算法,老年代采用标记-整理算法,多线程版serial收集器。
Parallel Scavenge 收集器,新生代采用复制算法,老年代采用标记-整理算法,关注吞吐量。
cms收集器,以获取最短回收停顿时间为目标的收集器,优点是发收集、低停顿。缺点是对 CPU 资源敏感;无法处理浮动垃圾;它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。
G1收集器,是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
技术挑战
对现有网站业务的冲击
高并发下的应用,数据库负载
突然增加的网络及服务器带宽。
防止直接下单
应对策略
秒杀系统独立部署
秒杀商品页面静态化
租借秒杀活动网络带宽
动态生成随机下单页面URL
评论