JVM内存中什么情况下一个对象会被垃圾回收

一旦年轻代快满了,那么垃圾回收的时候,到底哪些对象是能回收的,哪些对象是不能回收的呢?

 

1.被哪些变量引用的对象是不能回收的?

 

JVM中使用了一种可达性分析算法来判定哪些对象是可以被回收的,哪些对象是不可以被回收的

这个算法的意思,就是说对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots

在JVM规范中,局部变量就是可以作为GC Roots的

只要一个对象被局部变量引用了,那么就说明他有一个GC Roots,此时就不能被回收了

在JVM规范中,静态变量也可以看做是一种GC Roots,此时只要一个对象被GC Roots引用了,就不回去回收

总结:只要你的对象被方法的局部变量,类的静态变量给引用了,就不会回收他们

 

2.Java中对象不同的引用类型

 

Java中有不同的引用类型,分别是强引用、软引用、弱引用和虚引用

2.1 强引用,类似下面的代码:

public class Kafka {

    private static ReplicaManager replicaManager = new ReplicaManager();
    
}

这是最普通的代码,一个变量引用一个对象。

只要是强引用的类型,那么垃圾回收的时候绝对不会去回收这个对象的。

2.2 软引用

public class Kafka {
    //软引用
    private static SoftReference<ReplicaManager> replicaManager = 
            new SoftReference<ReplicaManager>(new ReplicaManager());

}

就是把“ReplicaManager”实例对象用一个“SoftReference”软引用类型的对象给包裹起来了,此时这个“replicaManager”变量对“ReplicaManager”对象的引用就是软引用了。

正常情况下垃圾回收是不会回收软引用对象的,但是如果进行垃圾回收之后,发现内存空间还是不够存放新的对象,内存快要溢出了,此时就会把这些软引用对象给回收掉,哪怕他被变量引用了,但是因为他是软引用,所以还是要回收。

2.3 弱引用

public class Kafka {
    //弱引用
    private static WeakReference<ReplicaManager> replicaManager =
            new WeakReference<ReplicaManager>(new ReplicaManager());

}

弱引用就跟没引用是类似的,如果发生垃圾回收就会把这个对象回收掉。

2.4 虚引用

暂时忽略即可,因为很少用

 

小结:其实比较常用的,就是强引用和软引用,强引用就是代表绝对不能回收的对象,软引用就是说有的对象可有可无,如果内存实在不够了,可以回收他。

 

3.finalize()方法的作用

 

综上所知,有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,如果有GC Roots引用,但是如果是软引用或者弱引用的,也可能被回收掉。

 

但如果没有GC Roots引用的对象,是一定立马被回收吗?

其实还有一个finalize()方法可以拯救他自己:

public class ReplicaManager {
    public static ReplicaManager instance;
    @Override
    protected void finalize() throws Throwable {
        ReplicaManager.instance = this;
    }
}

假设有一个Replicam对象就要被垃圾回收了,但是他重写了Object类中的finialize()方法

此时会先尝试调用它的finalize()方法,看是否把自己这个实例对象给了某个GC Roots遍历,比如说代码中就给了ReplicaManager类的静态变量。

如果重新让某个GC Roots变量引用了自己,那么就不会被垃圾回收了。

但这个平时基本很少用,了解即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值