Java中的四种引用

 

1.强引用

这类引用存在,GC永远不会回收这类引用;

2.软引用

Java对象的高速缓存 ,描述 一些有用但是非必须的对象
GC在内存充足时不会回收掉软引用对象,在内存不充足时会回收掉软引用对象
默认内存空间为5兆 -Xms5m -Xmx5m
class MyArray{
    byte[] bytes = new byte[3 * 1024 * 1024];
        }
public class Test31 {
    public static void main(String[] args) {
        //软引用对象
        ReferenceQueue<MyArray> queue = new ReferenceQueue<>();
        //将MyArray对象包装成一个软引用对象
        SoftReference<MyArray> reference = new SoftReference<>(new MyArray(),queue);

        System.out.println(reference.get());
        System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
        System.out.println(queue.poll());
        
        //System.gc();//垃圾回收
        byte[] array = new byte[3 * 1024 * 1024];

        System.out.println(reference.get());
        System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
        System.out.println(queue.poll());
    }
}

运行结果:

MyArray@1b6d3586
false
null
null
true
java.lang.ref.SoftReference@4554617c

超出内存空间,被回收的对象就会放入java.lang.ref.SoftReference@4554617c这个队列里面;

软引用适合做缓存,在内存足够时,直接通过软引用取值,无需从真实来源中查询数据,可以显著地提升网站性能。当内存不足时,能让JVM进行内存回收,从而删除缓存,这时候只能从真实来源查询数据

3.弱引用 

只能生存到下一次GC之前,当GC工作时,无论当前内存是否充足,GC都会回收掉与弱引用关联的对象

 

class A{
    
}        
public class Test31 {
    public static void main(String[] args) {
        //弱引用对象
        ReferenceQueue<A> queue = new ReferenceQueue<>();
        WeakReference<A> reference = new WeakReference<>(new A(),queue);

        System.out.println(reference.get());
        System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
        System.out.println(queue.poll());
        
        System.gc();

        System.out.println(reference.get());
        System.out.println(reference.isEnqueued());//判断当前的对象是否被回收
        System.out.println(queue.poll());
}
}

运行结果:

A@1b6d3586
false
null
null
true
java.lang.ref.WeakReference@4554617c

弱引用的生命周期比较短暂,一旦进行垃圾回收,弱引用就会被回收掉,可以将一些临时变量或者生命周期短的对象包装成弱引用对象;

4.虚引用 (幽灵引用)

一个对象是否有虚引用的存在,完全不会对其生命周期造成影响,也无法通过虚引用来获取一个对象的实例,唯一可以使用虚引用来判断当前对象是否已经被垃圾回收;

class A{

}
public class Test31 {
    public static void main(String[] args) {
        //虚引用对象
        ReferenceQueue<A> queue = new ReferenceQueue<>();
        PhantomReference<A> ptr = new PhantomReference<>(new A(),queue);
        
        System.gc();
        System.out.println(ptr.isEnqueued());
}
}

运行结果:有时为true,有时为false;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值