架构师训练营第九章作业
请简述 JVM 垃圾回收原理。
Java堆是JVM主要的内存管理区域,里面存放着大量的对象实例和数组。在垃圾回收算法和垃圾收集器之前,首先要做的就是判断哪些对象已经“死去”,需要进行回收即不可能再被任何途径使用的对象
引用计数法
引用计数法是这样:给对象中添加一个引用计数器,每当有一个地方使用它时,计数器值就加1。当引用失效时,计数器就减1。任何时刻计数器为0的对象就是不可能再被使用的。
现在主流的Java虚拟机都没有使用引用计数法,最主要的原因就是很难解决对象之间互相循环引用的问题
可达性分析
可达性分析的基本思路:通过一系列称为"GC Roots"的对象作为起点,从这些节点开始向下搜索,如果从GC Roots到一个对象不可达,则证明此对象是不可用的
Java语言中,可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象
本地方法栈JNI(即一般说的Native方法)引用的对象
方法区中类静态常量引用的对象
方法区中常量引用的对象
四种引用,由高到低依次为:强引用、软引用、弱引用和虚引用
垃圾收集算法
标记-清除算法分为“标记”和“清除”两个阶段
标记:首先标记出所有需要回收的对象
清除:在标记完成后统一回收所有被标记的对象
标记-清除算法主要有两个不足:
效率问题,标记和清除的两个过程效率都不高
标记-清除会产生大量不连续的内存碎片,这会导致在后面需要分配连续的大对象时,无法找到足够大的连续内存而导致不得不提前触发另一次垃圾收集动作
复制算法的大致思路:
首先将可用内存分为大小相等的两块,每次只使用其中的一块。
当这一块的内存用完了,就将还存活的对象连续复制到另一块上面,然后把使用过的内存空间一次清理掉
标记-整理算法分为“标记”和“整理”两个阶段:
标记:首先标记出所有需要回收的对象
整理:让所有的存活的对象都向一端移动,然后直接清除掉边界以外的内存
分代收集算法是降Java堆分为新生代和老年代,根据其各自的特点采用最适当的收集算法。
新生代中大批对象死去,只有少量存活,就选用复制算法
老年代中对象存活几率高,没有额外的空间对它进行分配担保,就必须使用标记-清除或者标记-整理算法。
垃圾回收器
JVM垃圾收集器发展历程大致可以分为以下四个阶段: Serial(串行)收集器 -> Parallel(并行)收集器 -> CMS(并发)收集器 -> G1(并发)收集器
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀系统主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。另外,我们还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生
原则就是数据要尽量少、请求数要尽量少、路径要尽量短、依赖要尽量少,以及不要有单点。
比如
把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,减少了页面的复杂度;
在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;
将热点数据(如库存数据)单独放到一个缓存系统中,以提高“读性能”;
如增加秒杀答题,防止有秒杀器抢单,减少服务器瞬时峰值的压力
评论