写点什么

架构师训练营 Week9 - 课后作业

用户头像
关注
发布于: 2020 年 12 月 16 日
架构师训练营 Week9 - 课后作业

1. 请简述 JVM 垃圾回收原理。

  • 垃圾回收的原因,Java的对象都是创建在堆内存上的。程序运行一段时间之后就会有一部分对象可能不在使用但是仍然占用内存空间直到没有可用内存OOM,这时就需要垃圾回收。相较于C,C++可以通过程序手动释放变量占用的内存空间, Java提供了垃圾回收器负责自动清理。简称GC。

  • 对象分代:大部分新产生的对象可能很快就无用;存活较久的对象可能会存活更长时间。因此对内存池划分为不同区域。

  • 年轻代(Young Gen):新生代(Eden)、Survivor-0(S0), Survivor-1(S1)

  • 老年代(Old Gen)

  • GC步骤:标记、清理、压缩、复制。它们结合起来有不同的清理方式

  • 标记-清理(Mark-Sweep):通过可达性分析标记存活对象,清理掉不可达(垃圾)对象。简单,容易产生内存碎片。

  • 标记-清除-压缩:标记清理完成后,对剩下的存活对象进行内存整理,保证内存连续空间。

  • 标记-复制(Mark-Copy):始终保留一部分内存空闲区域,GC时把存活对象复制到空闲区域,对复制完成的区域完全清理,不会留下内存碎片。不适合老年代对象。

  • 可达性分析:GC通过通过对象引用计数来标记存活对象(active object)。引用计数起点是通过GC roots对象开始的。GC Roots 对象包括:

  • 当前执行方法的输入参数,局部变量

  • 所有类的静态字段

  • 活动线程

  • JNI引用,及Java Native Interface, Java 跟OS 本地接口调用过程中产生的应用变量。

最终标记完成,不可达的对象就是垃圾对象可以被清理。



  • Stop the world(STW): 程序运行过程中会不断产生新的对象和垃圾对象,同时进行GC和运行程序可能永远也不能完成清理。这时就要使Java程序暂停,让JVM只执行GC。



  • 垃圾回收器类型:既然stop the world就会对程序产生影响。减少STW的时间就成为一个迫切的需求。从而衍生了各类的垃圾回收期来优化STW时间。

  • 串行GC : 最原始的做法,垃圾回收触发时,单线程执行垃圾回收,执行时间长,STW时间长。

  • Serial: 新生代,复制算法(标记-复制)

  • SerialOld: 老年代,标记整理算法(标记-清除-整理)

  • 并行GC: 同样是STW,但是会多线程执行垃圾回收。相较Serial 效率有所提高。

  • ParNew:新生代,复制算法

  • Parallel Scavenge(JDK8):新生代,复制算法。 与ParNew区别,可以通过参数控制STW的时间提高程序吞吐量,降低长时间STW的影响。但是参数设置STW过小,可能会导致频繁GC反而影响吞吐量。

  • CMS(Mostly Concurrent Mark Sweep): 在Full GC之前会有并发的线程做初始标记和预清理操作。最终标记阶段仍然需要STW,但是STW时间会缩短,最终标记结束后恢复并发清理,并会有并发重置(重置并发算法的内部数据)

  • G1(Java 9): 堆内存不在划分年轻代和老年代,而是把内存区域分为2048个小块 Region,Region Size可以从1M到32M设置。对象建立在不同的Region上,G1可以实时对个Region上的内存对象进行分析。根据限定的STW时间,G1会对一部分Region做GC清理,可以更大程度的降低STW时间。GC时存活对象会从一个Region转移到另个Region称为Evacuation。标记-整理-复制算法。

适合较大堆内存 4G以上。

  • ZGC(Java 11): GC最大停顿时间不超过10ms, 支持更大的堆内存容量范围从几百MB到4TB(JDK13升至16TB)

  • Shnandoah GC:设计为与应用程序并发执行,更短的停顿时间



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

--空白--



用户头像

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 Week9 - 课后作业