Java的四种引用:强软弱虚。
Java中的数据被类型分为了两类,它们分别是基本类型和引用类型。
一般我们new出来的对象都属于引用类型的范畴。
我们知道Java是有垃圾回收机制的一种语言,
根据垃圾回收时的策略,Java将对于堆对象的引用又进行了细分,
引用被分为了强引用,软引用,弱引用和虚引用。
强引用
又称普通引用,是最常见的一种引用类型,通过new
关键字创建对象时,变量对于堆对象的引用就是强引用。
强引用的特点:
· 如果堆中的一个对象被强引用指向,那么这个变量将不会被GC回收。
· 在堆内存不够用的情况下,被强引用指向的对象也不会被回收。(宁可抛出OOM异常)
· 被强引用指向的对象,只有在引用消失后才会被GC回收。
软引用
软引用的创建需要借助jdk中java.lang.ref.SoftReference
这个类来创建。也就是说,我们的变量是先引用到SoftReference这个对象,SofReference这个对象再去引用我们想要设置为软引用的对象。
软引用的特点:
· 当堆内存够用时,被软引用指向的对象不会被GC回收。
· 当堆内存不够用时,被软引用指向的对象自动的被GC回收。
注:软引用指向对象的回收是在触发GC的条件下才会被回收,如果内存够用,就算显式的调用GC,软引用指向的对象也不会被回收。
弱引用
弱引用的创建方式与软引用类似,需要借助于jdk中java.lang.ref.WeakReference
类去创建。
弱引用的特点:
· 不管什么情况,遇到GC就会回收被弱引用指向的对象。
虚引用
是一种十分特殊的引用,它主要用在堆外内存的管理,虚引用可以指向堆中的对象,但是没有实际的意义。
虚引用的特点:
· 无法获取虚引用指向的对象的值。
· 虚引用在被GC回收时会有通知。
· 虚引用在遇到GC时,不管是否还有对象引用它,它都会被GC回收。