• 技术文章 >Java >java教程

    Java引用类型包括哪些?

    青灯夜游青灯夜游2020-07-25 11:52:25原创1333

    在Java中,引用类型包括有:1、强引用(StrongReference);2、软引用(SoftRefernce);3、弱引用(WeakReference);4、虚引用(PhantomReference)。

    Java的引用类型

    Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点。

    从JDK1.2开始,Java中的引用类型分为四种,分别是:

    ①强引用(StrongReference)

    ②软引用(SoftRefernce)

    ③弱引用(WeakReference)

    ④虚引用(PhantomReference)

    强引用-StrongReference

    这种引用是平时开发中最常用的,例如Stringstrong=newString("StrongReference"),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。

    软引用-SoftReference

    如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。

    ReferenceQueuereferenceQueue=newReferenceQueue();
    SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);
    Bookbook=softReference.get();
    Referencereference=referenceQueue.poll();

    当系统内存不足时,触发gc,这个Book就会被回收,reference将不为null。

    弱引用-WeakReference

    只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。

    ReferenceQueuereferenceQueue=newReferenceQueue();
    WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);
    Bookbook=softReference.get();
    System.gc();
    //Runtime.getRuntime().gc();
    Referencereference=referenceQueue.poll();

    当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。

    虚引用-PhantomReference

    如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。

    与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?

    PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);
    Bookbook=phantomReference.get();//此值为null
    Referencereference=referenceQueue.poll();

    推荐教程:《java教程

    以上就是Java引用类型包括哪些?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:Java 引用类型
    上一篇:实例解析Java图片与byte数组互相转换 下一篇:Java中string类的常用方法有哪些?
    大前端线上培训班

    相关文章推荐

    • Java如何通过计算两个日期的时间差来算出天数• 实例介绍java中的Calendar类• 详细介绍Java中的File类• java线程的几种状态是什么?• Java 实现通讯录管理系统教程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网