- JVM怎么确定对象已经成为垃圾
Java虚拟机(JVM)确定一个对象已成为垃圾主要依据可达性分析(Reachability Analysis)算法,也称为根搜索算法(GC Roots Tracing)。这个过程涉及以下几个步骤:
1. 定义GC Roots:首先,JVM确定一组称为GC Roots的对象集合。这些对象是垃圾回收过程中的起点,它们包括但不限于:
- 类加载器(Class Loaders)
- 活动的线程(Threads)
- 虚拟机栈(VM Stacks)中本地变量表引用的对象
- 方法区(Metaspace,之前称为永久代)中静态变量引用的对象
- JNI(Java Native Interface)引用的对象
2. 可达性分析:从GC Roots开始,JVM遍历整个对象图,通过对象引用关系,标记所有可以从GC Roots直接或间接访问到的对象。这个过程可以看作是从GC Roots出发,沿着引用链(Reference Chains)探索所有可达的对象。
3. 未标记对象为垃圾:遍历完成后,没有被标记的对象即被认为是不可达的,这些对象就被视为垃圾,因为它们不再被应用程序的任何部分所引用。
尽管引用计数法也是一种判断对象是否为垃圾的算法,但由于它无法处理循环引用的问题(即两个或多个对象互相引用,但不再被程序其他部分使用的情况),现代JVM普遍采用可达性分析作为判断对象是否为垃圾的主要标准。
一旦对象被标记为垃圾,JVM的垃圾回收器(Garbage Collector)会在合适的时机(如内存不足或满足某些条件时)回收这些对象所占用的内存空间,以供后续的新对象分配使用。
如果大家需要视频版本的讲解,欢迎关注我的B站: