java垃圾回收(GC)机制

发布时间 2023-06-13 14:29:43作者: 翊梦

一、为什么要进行垃圾回收?

因为内存的容量是有限的。

二、如果判断一个对象需要回收?

1、引用计数算法:给每个对象中加一个引用计数器。每增加一个引用,计数器就+1。当计数器为0时,代表没有引用。因为循环引用的存在,所以java虚拟机不再使用引用计数算法。

2、可达性分析算法:通过GC Roots作为起始点向下搜索。搜索所走过的路径成为引用链。如果没有引用链,则对象可以被回收。

3、对方法区的回收:主要是对常量池的回收和对类的卸载。

三、四种引用状态

  1. 强引用。被强引用关联的对象不会被回收。使用new一个新对象的方式来创建强引用。
  2. 软引用。被软引用关联的对象只有在内存不够时才会被回收。使用SoftReference类来实现软引用。
  3. 弱引用。被弱引用关联的对象一定会被回收。也就是说它只能存活到下次垃圾回收发生之前。使用WeakReference类来实现弱引用。
  4. 虚引用。又被成为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。为一个对象设置虚引用的唯一目的就是能够在这个对象被回收时收到一个系统通知。

四、垃圾回收算法

1、标记清除算法(mark-sweep)

将存活的对象进行标记,然后清理掉未被标记的对象。

不足:

(1)标记和清除过程效率都不高。

(2)会产生大量不连续的内存碎片,导致无法给大对象分配内存。

2、标记整理算法(mark-compact)

让所有存活对象都向一端移动。然后清理掉端边界以外的对象。

3、复制算法(copying)

4、分代收集