写点什么

第九周作业

用户头像
carol
关注
发布于: 2020 年 08 月 05 日
第九周作业

作业一:简述 JVM 垃圾回收原理


常见的垃圾收集器


  • Serial GC:单线程收集,在收集过程中会进入 STW 状态,优点是简单,无复杂操作。从年代的角度来看也会区分 Serial Old 和 Serial New,这两种分别采用的垃圾收集算法也不一样。新生代的借用的是复制算法,老年代采用的是标记-整理算法。对应的 JVM 参数

-XX:UseSerialGC
复制代码


  • ParNew GC:新生代 GC,是 SerialGC 的多线程实现。在收集过程中也会进入 STW 状态,但是整体效率比 SerialGC 要高一些。最常见用法就是在一些早期的 JDK 版本中,配合 CMS GC 来工作。对应 JVM 参数:

-XX:UseParNewGC -XX:UseConMarkSweepGC
复制代码


  • CMS GC:在早期的对垃圾时间比较敏感的 web 应用中,经常会使用这种垃圾收集器,它可以有效的减少 STW 状态的时间。但由于它是基于标记-清除算法,所以在收集的过程难免会产生许多的内存碎片,长时间运行就不可避免的会导致 fullGC,因而会导致时间更长的 STW。此外由于采用大量的并发操作,所以对于 CPU 资源消耗也是非常明显的。因此,在后续的版本中也会渐渐的被废除掉。对应的 JVM 参数,见 ParNew GC 说明。

  • Parallel GC:这种垃圾收集器是提升吞吐量为目标的,可以并行的对新生代和老年代进行回收。这种处理的方式,常用在服务器环境中。对应的 JVM 参数:

-XX:UseParallelGC
复制代码


  • G1 GC:上面所述的收集器或是在响应时间做文章,或是以吞吐量为提升目标。G1 就是一个内外兼修的收集器,可以同时兼顾响应时间和吞吐量,特别适用于大内存(堆)的场景下。也是 Oracle JDK9 以后默认的垃圾收集器。在对 CMS GC 时,虽然好情况下响应时间不相上下,但是在坏情况却比 CMS 优秀多了。为啥这么优秀呢?这要归功于 G1 的设计,虽然在 G1 中仍然存在着年代的概念,但已经不再像以往那么条带式的划分了,而是把内存划分成了一个格一个格的 Region,region 之间复制算法,但从整体上来看还是标记-整理算法。在提升响应时间的同时,也有效的减少了内存碎片的影响范围,这种垃圾收集器,值得深入进行研究。

  • ZGC:是新时代的开源出来的一个超级 GC,具备超强的扩展能力。


垃圾收集算法


  • 复制算法:新生代 GC 基本都使用的是复制算法,过程基本也都是将活着的对象复制到 to 区,复制的过程中将对象顺序存放,从而避免内存碎片的产生,这也是此种算法的优势,思路也值得在开发过程所借鉴,属于典型的空间换时间思路。缺点也很明显了,就是造呀,可劲的浪费。

  • 标记-清除算法:首先进行标记,把要回收的对象都标记出来,然后进行清除。典型应用就是 CMS 回收器中,容易产生内存碎片,另外进行标记、再清除也是需要时间的,也需要 CPU 进行参与。因此并不适合大内存空间的回收。

  • 标记-整理算法:跟标记-清除算法比较类似,但并非清除而是将空闲的内存空间进行整理,让其连续,以此来完成减少内存碎片化的目标。


垃圾收集器工作的基本流程


  • 通用垃圾回收流程:

  • 创建 java 对象,分配在 Eden 区,当空间达到一定阈值时触发 minor GC,将存活对象复制到当前的 To 区中去,并对存活对象进行计数。对其它的对象进行回收

  • 经过一次 Minor GC 之后 ,Eden 区就空下来了,再分配 java 对象,到达阈值之后再触发 MinorGC,再将存活对象复制到此时的 To 区中去,并对存活对象进行计数+1。

  • 多次 MinorGC 之后,计数值也达到了阈值,得了,这部分超过阈值的对象们,请到老年代呆着去吧。新生代已经留不下你们了。

  • 老年代也有放不下的时候呀,这时就会根据具体的收集器对应的收集算法进行回收。以标记-整理算法为例,老年代将没有被引用的对象清除后,GC 会对内存进行整理,防止内存碎片化。这也是就 Major GC。

咦,咋没有 Full GC 呢?

Major GC 在很多参考资料中是等价于 Full GC 的,很多性能监测工具中只有 Minor GC 和 Full GC。一般情况下,一次 Full GC 将会对年轻代、老年代、元空间以及堆外内存进行垃圾回收。触发 Full GC 的原因有很多:

  • 当年轻代晋升到老年代的对象大小,并比目前老年代剩余的空间大小还要大时,会触发 Full GC;

  • 当老年代的空间使用率超过某阈值时,会触发 Full GC;

  • 当元空间不足时(JDK1.7 永久代不足),也会触发 Full GC;

  • 当调用 System.gc() 也会安排一次 Full GC。


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


面临的挑战


  • 对现有网站业务造成冲击

  • 高并下的应用,数据库负载

  • 突然暴增的网络及服务器带宽

  • 直接下单


应对策略


  • 独立部署秒杀应用

  • 秒杀页面静态化方案

  • 租借秒杀活动带宽网络

  • 动态生成随机下单页面 url


架构设计


整个秒杀系统的设计应该紧紧围绕“简单“两个字进行扩展:简单的页面设计、简单的下单流程。


用户头像

carol

关注

还未添加个人签名 2018.04.13 加入

还未添加个人简介

评论

发布
暂无评论
第九周作业