1. 引用计数法
- 基本原理:每个对象都有一个引用计数器,当有一个地方引用该对象时,计数器加一;当引用失效时,计数器减一。如果计数器为零,则说明该对象没有被引用,可以被回收。
- 缺点:引用计数法无法处理循环引用的问题。也就是说,如果两个对象互相引用,但没有其他外部引用,它们的计数器都不会为零,导致无法被回收。
2. 可达性分析法
-
基本原理:可达性分析法通过一组被称为“GC Roots”的根对象集合作为起点,向下搜索所有可达的对象。所有能从GC Roots到达的对象被认为是存活的,否则就是不可达的,可以被回收。
-
GC Roots:通常包括以下几种:
-
优点:可达性分析法能够有效处理循环引用的问题,因为它不依赖于引用计数,而是通过对象间的可达性来判断。
垃圾回收器的实现
JVM中有多种垃圾回收器,每种回收器在判断对象存活后都有不同的策略来回收内存,比如:
- 标记-清除算法:首先标记出所有存活的对象,然后清除掉未标记的对象。
- 复制算法:将存活的对象复制到新空间,然后清理掉旧空间中的所有对象。
- 标记-整理算法:标记出所有存活的对象后,将它们整理到内存的一端,清理掉另一端的空间。
不同的垃圾回收器可能会结合这些算法来优化性能和内存使用,比如新生代使用复制算法,老年代使用标记-整理算法等。
通过这些方法和策略,JVM的垃圾回收器能够有效地管理内存,确保不再使用的对象被正确地回收,从而提高应用程序的性能和稳定性。