文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java的引用类型常用的四种方法

2024-04-02 19:55

关注

前言

今天看代码看到有牵扯到弱引用的东西,就先稍微补一补Java的四种引用类型吧。Java为引用类型专门定义了一个类Reference,它是引用对象的抽象基类。

这个类定义了所有引用对象共有的操作。 由于这个类和垃圾收集器是息息相关的,这个类不能直接子类化。

Reference有4个子类,分别为强引用FinalReference、软引用SoftReference、弱引用weakReference、虚引用PhantomReference。

意思就是这四种引用是在JVM中GC用的,我们工作写代码根本用不着。

强引用FinalReference

Object obj = new Object();

上面我们new了一个Object对象,并将其赋值给obj,这个obj就是new Object()的强引用。
Java中的引用默认就是强引用。

强引用的特性是只要有强引用存在,被引用的对象就不会被垃圾回收。只有强引用不存在了,被引用的对象才会被垃圾回收。

写个demo吧,新建一个BeanA,重写finalize方法:

public class BeanA {
    @Override
    protected void finalize(){
        System.out.println("将对象从内存中清除出去");
    }
}

然后写个测试方法,将强引用置为空后,通知JVM垃圾回收。

    public static void main(String[] args) throws IOException {
        BeanA a = new BeanA();
        a=null;
        System.gc();
        //防止gc线程结束后还未执行finalize方法
        System.in.read();
    }

输出结果:将对象从内存中清除出去。

可以看到强引用不存在了,被引用的对象是可以被垃圾回收的。

软引用SoftReference

软引用是用于描述一些有用但非必需的引用。

SoftReference的实例保存一个Java对象的软引用,该软引用的存在不影响垃圾回收线程对该Java对象的回收。

意思就是只有在内存不足的情况下,被引用的对象才会被回收,内存够用是不会被回收的。

只要垃圾回收器没有回收它,该对象就可以被程序使用。和这个软引用是没有关系的(即没有将软引用置空),只和内存有关。

直接看demo:

public static void main(String[] args){
        SoftReference<byte[]> soft = new SoftReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.gc();
        //注释掉下面这句两次get()方法都能获取到
        //byte[] bytes = new byte[1024 * 1024 * 15];
        System.out.println(soft.get());
    }

我们创建了一个SoftReference对象,其变量名soft强引用着这个SoftReference对象,而这个SoftReference对象则保存着一个软引用,这个软引用引用的是一个10M的数组。

当然这个10M数组也可以替换成自己新建的对象:

A a=new A();
SoftReference<A> soft =new SoftReference<>(a);

这样的话SoftReference对象中保存的a就变成了软引用,如果内存足够的话,将a=null,GC后使用soft.get还是可以获取到该对象。

我们这里使用10M数组来测试,启动测试类设定VM内存20M,发现再新建一个15M数组后会将原来的10M数组给GC掉。

输出结果:

[B@2cfb4a64
[B@2cfb4a64

[B@2cfb4a64
null

总结一句话就是:创建强引用时内存不够就把软引用占的内存给回收掉。

总结一个词就是:欺软怕硬。

另外软引用非常适合缓存使用。

弱引用weakReference

弱引用和软引用很类似,不同的是弱引用引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。

我demo没有设定vm:Xmx=20M,通知JVM进行垃圾回收后依然会将被引用对象回收掉。

    public static void main(String[] args){
       WeakReference<byte[]> soft = new WeakReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        //通知JVM进行垃圾回收
        System.gc();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(soft.get());
    }

输出结果:

[B@2cfb4a64
null

虚引用PhantomReference

首先,虚引用是无法通过get方法来获取的。一个虚引用对象被回收时会被放在一个ReferenceQueue队列中,意思就是虚引用回收时会给出一个信号放在队列中。

        ReferenceQueue<Object> rq = new ReferenceQueue<>();
        Object obj = new Object();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj,rq);
        obj = null;
        System.out.println("Reference: "+phantomReference.get());
        System.gc();
        Reference<Object> r = (Reference<Object>)rq.poll();
        System.out.println("ReferenceQueue:  "+r);

输出结果两个null。只有VM内存不足时才会回收这个虚引用,才会将其放在队列中,才能通过poll()获取到队列中的PhantomReference对象,而这个引用对象需要程序员自己进行特殊处理。

那问题来了,甭管G不GC我都拿不到它,那它有啥用?

其实它一般用来管理直接内存,我们的垃圾回收器是在JVM中管理内存的,如果我们从网络中下载一个文件保存在os的内存中,而 新版JVM不需要copy一份到jvm内存中,通过引用可以直接访问操作系统管理的内存,当我们回收这个虚引用时,则会在队列中放入这个引入对象,方便用来特殊处理。

到此这篇关于Java的引用类型常用的四种方法的文章就介绍到这了,更多相关Java引用类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯