架构师训练营第九周作业

用户头像
坂田吴奇隆
关注
发布于: 2020 年 08 月 02 日



作业一:

请简述 JVM 垃圾回收原理。

JVM的自动内存管理最核心的功能是堆内存中对象的分配与回收。Java的堆空间基本结构如下:





JVM的堆可细分为新生代和老年代,其中新生代又可以划分为Eden 空间、From Survivor、To Survivor 空间等,进一步划分的目的是为了更好的回收内存或者更快的分配内存。

堆内存常见的分配策略如下:

  1. 对象优先在eden区分配,因为大多数对象是朝生夕死的。

  2. 大对象直接进入老年代,避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。

  3. 长期存活的对象将进入老年代,如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1.对象在 Survivor 中每熬过一次 MinorGC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。



常见的垃圾回收算法:



  • 标记清除算法

该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。

存在的问题:可能产生大量的内存碎片。

  • 复制算法

将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收

  • 标记整理算法

根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法

根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。



常见的垃圾收集器:



  1. serial收集器,新生代采用复制算法,老年代采用标记-整理算法。 

  2. ParNew收集器,新生代采用复制算法,老年代采用标记-整理算法,多线程版serial收集器。

  3. Parallel Scavenge 收集器,新生代采用复制算法,老年代采用标记-整理算法,关注吞吐量。

  4. cms收集器,以获取最短回收停顿时间为目标的收集器,优点是发收集、低停顿。缺点是对 CPU 资源敏感;无法处理浮动垃圾;它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

  5. G1收集器,是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.



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



  • 技术挑战

  1. 对现有网站业务的冲击

  2. 高并发下的应用,数据库负载

  3. 突然增加的网络及服务器带宽。

  4. 防止直接下单



  • 应对策略

  1. 秒杀系统独立部署

  2. 秒杀商品页面静态化

  3. 租借秒杀活动网络带宽

  4. 动态生成随机下单页面URL



用户头像

坂田吴奇隆

关注

还未添加个人签名 2019.01.06 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周作业