被哪些变量引用的对象是不能被回收的?
JVM 中使用了一种可达性分析算法,来判断哪些对象是可以被回收的,哪些是可以被回收的。
这个算法的意思,就是说对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots。
那么哪些可以作为 GC Roots:
- 局部变量 -- 只要一个对象被局部变量引用,那么就不能被回收
- 静态变量
Java 中对象的不同引用类型
Java 中的不同引用类型分别是:
强引用、软引用、弱引用和虚引用。
1、强引用
public class Kafka {
public static ReplicaManager replicaManager = new ReplicaManager();
}
这就是强引用,只要是强引用,那么垃圾回收的时候就绝对不会去回收。
2、软引用
public class Kafka {
public static SoftReference<ReplicaManager> replicaManager =
new SoftReference<ReplicaManager>(new ReplicaManager());
}
软引用,正常情况下垃圾回收是不会回收的,但是如果你进行垃圾回收之后,发现内存空间还是不够用,内存快溢出来,此时就会把这些软引用对象给回收掉,哪怕他被变量引用来,但是因为它是软引用,所以还是要被回收。
3、弱引用
public class Kafka {
public static WeakReference<ReplicaManager> replicaManager =
new WeakReference<ReplicaManager>(new ReplicaManager());
}
弱引用,发生垃圾回收就会把这个对象回收掉。