JVM(三)GC垃圾回收以及四种GC算法

JVM(三)



一、GC垃圾回收

垃圾回收只存在于堆和方法区中(方法区本质上也属于堆)。

JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代。

    新生代 幸存区(from区、to区/0区、1区) 老年区

GC有两种类型:轻GC(普通GC,发生在新生代和幸存区)、重GC(全局GC)

GC题目:

  1. JVM的内存模型和分区,详细到每个区放什么
  2. 堆里面的分区有哪些?Eden、from、to、老年区,说说他们的特点
  3. GC的算法有哪些,怎么用的?标记清除法、标记压缩法、复制算法、引用计数法
  4. 轻GC和重GC分别在什么时候发生

二、GC算法之引用计数法

这种方法不好,高效且low,用的很少。


三、GC算法之复制算法

新生区主要用的复制算法。

步骤:

    第一步:Eden区中的对象移动到幸存区to区 第二步:幸存区from区中的对象移动到幸存区to区,此时from区和to区互换了(谁空谁是to) 第三步:幸存区对象满15(15次GC也没有清除)则进入养老区,否则离开(被清除)

好处:没有内存的碎片

坏处:浪费了内存空间(一半的幸存区(to区)空间永远是空的)

复制算法最佳使用场景:对象存活度较低的时候,也就是新生区。


四、GC算法之标记清除算法

扫描所有对象,对活着的对象进行标记;然后清除掉没有标记的对象。

优点:

    不需要额外空间

缺点:

    两次扫描严重浪费时间 会产生内存碎片(上图虚线框)

五、GC算法之标记压缩算法

标记压缩算法是标记清除方法的一个优化。在标记清除的前提下再次扫描,向一端移动存活的对象,会增加一个“移动”耗费的成本。

压缩的目的:防止内存碎片的产生。

其名称曰:标记清楚压缩算法。因为是在标记清除算法的基础上做的。


六、对比总结

内存效率、整齐度、利用率

    内存效率:复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度) 内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法 内存利用率:标记压缩算法 = 标记清除算法 > 复制算法

没有最优的算法,只有最合适的算法。 GC:也被称为分代收集算法。“分代”:

    新生代:存活率低,使用复制算法 老年代:区域大,存活率高,使用标记清除+标记压缩混合实现
经验分享 程序员 微信小程序 职场和发展