JVM 复习 三 GC回收算法

  1. GC作用区域

    • 方法区和堆

  2. GC是什么

    • 分代收集算法

      • 次数上频繁收集Yong区

      • 次数上较少收集Old区

      • 基本不动Perm区

  3. GC的4大算法

    • GC算法的总体概述

      • JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。

      • 因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC),

      •   普通GC(minor GC):只针对新生代区域的GC。

      •   全局GC(major GC or Full GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。

    • 4大算法

      • 引用计数法:

        • 缺点

          • 每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的消耗。

          • 较难处理循环引用。

      • 复制算法:

        • 年轻代中使用的是Minor(maɪnə)  GC,这种GC算法采用的是复制算法

        • 原理:(To区被填满 ,会将所有对象移动到年老代中)

          • Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old  generation中,也即一旦收集后,Eden是就变成空的了。

          •  当对象在 Eden ( 包括一个 Survivor 区域,这里假设是  from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及  Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,通过-XX:MaxTenuringThreshold 来设定参数),这些对象就会成为老年代。

          • -XX:MaxTenuringThreshold — 设置对象在新生代中存活的次数

        • 解释:

          • 原理:

            • 从根集合(GC Root)开始,通过Tracing从From中找到存活对象,拷贝到To中

            • From,To交换身份,下次内存分配从To开始

          • 优点:

            • 没有标记和清除的过程效率高

            • 没有内存碎片

          • 缺点:

            • 浪费了一半的内存,

            • 如果对象存活率很高,很耗费性能

      • 标记清除

        • 老年代一般采用的是标记清除和标记整理的混合实现

        • 原理

          • 标记:从根集合开始扫描,对存活的对象进行标记

          • 清除:扫描整个内存空间,回收未被标记的对象

        • 劣势

          • 会产生内存碎片

          • 此算法需要暂停整个应用,两次扫描,效率低

        • 优势:

          • 不会产生额外的空间

      • 标记压缩

        • 原理

          • 标记:从根集合开始扫描,对存活的对象进行标记

          • 压缩:再次扫描,并往一端滑动存活对象

          • 在整理压缩阶段,不再对标记的对像做回收,而是通过所有存活对像都向一端移动,然后直接清除边界以外的内存。

        • 优势:

          • 不会产生内存碎片

        • 劣势:

          • 效率也不高

      • 标记清除压缩

        • 原理:先标记,在清理,最后进行压缩

        • 优势:减少移动对象的成本

    • 小总结

      • 采用分代收集算法

        • 年轻代因为对象存活率低且对象较多,,复制算法

        • 老年的代因为存活率高    标记清除压缩算法

你可能感兴趣的:(JAVA,JVM)