02 JVM垃圾回收

java依靠内存垃圾回收(GC),不需要手动释放对象。通过可达性分析判定垃圾,根据对象生命周期的不同使用不同的策略进行回收。

可达性分析

分析以GVRoot对象为起点的引用链,不在链上的对象为可回收对象。下面几种对象可作为GCRoot:

  1. 虚拟机栈局部变量表中引用的对象
  2. 方法区中静态引用指向的变量
  3. 存活状态中的线程对象
  4. native方法JNI引用的对象

GC算法

  1. 标记清除算法:可达性分析,不可达标记为垃圾对象,清除。
    优点是简单,不需要移动对象;缺点是需要停止组件运行,产生内存碎片
  2. 复制算法:内存分区,将存活对象复制到另一分区
    优点是实现简单高效,无内存碎片;缺点是可用内存缩小为一半,对象存活率高时频繁复制;
  3. 标记压缩算法:将存活对象,移动到内存一端
    优点是没有减小可用内存,无内存碎片,性价比高;缺点是需要局部对象移动,降低效率

JVM分代回收策略

根据对象生存周期的不同,将对象存放在不同的分区,新生代及老年代,新生代采用复制算法,老年代采用标记压缩算法,提高效率。

新生代又分为Eden、survivor0及survivor1分区,Eden满触发GC,存活对象复制到S0,再次触发GC复制到S1,S0及S1来回交替,当存活对象在一定次数的GC后依然存活,放到老年区;

新生代 的 GC 叫作 Minor GC。因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。

老年代 GC 也叫作 Major GC 或者 Full GC。当出现了 Major GC,经常会伴随至少一次的 Minor GC。

引用类型

强:不会回收内存
软:内存实在不够会回收
弱:GC会回收
虚:不会影响对象生命周期

你可能感兴趣的:(02 JVM垃圾回收)