四种GC算法

四种GC算法

GC垃圾回收,首先需要判断哪些对象需要回收

判断对象存活

可达性分析

​ 从GC Roots开始向下查询,如果一个对象到任何一个GC Root对象都没有一个引用链相连的话,说明此对象不可用。

四个GC Root对象

  1. JVM栈中引用的对象
  2. 方法区静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地栈中JNI中引用的对象

四种GC算法

引用计数

​ 每个对象都有一个引用计数属性,多一个引用+1,少一个引用-1,为0的时候代表可以回收。

​ 致命缺点:无法解决循环引用

复制算法

​ 将内存分为两块,当一块内存用完了,就将存活的对象复制到另一块内存中。

​ 优点:空间连续,没有内存碎片,运行效率高。

​ 缺点:占用内存,如果复制长期生存的对象,会导致效率低。

​ 主要用在新生代,因为新生代对象存活率低。

标记-清除

​ 先标记出需要清除的对象,再将标记的对象回收。

​ 优点:占用内存小

​ 缺点:

​ (1)需要进行两次动作,标记和清除,所以效率低。

​ (2)回收完之后,内存不连续,会有内存碎片

标记-压缩

​ 先标记出需要清除的对象,但是不进行回收,而是让所有存活对象都向一段移动,然后清除边界之外的内存空间。

​ 优点:占用内存小,没有内存碎片

​ 缺点:效率低

分代收集

​ 根据Java堆的新生代和老年代的特点,选用不同的回收算法。新生代内存空间大,对象会大量死去,回收频繁,使用效率高的复制算法,只需要每次复制少量存活下来的对象即可。老年代内存空间小,对象存活率高,使用标记-清除/标记-压缩算法。

猜你喜欢

转载自www.cnblogs.com/jjpp/p/12176243.html