Java引用类型(软、硬、弱、幻象)

Java在jdk1.2推出了软引用、弱引用、虚引用三个概念:

#1.强引用: 就是我们平时创建的对象引用。

例如:

String string = new String("");
复制代码

类似于这样的引用是强引用。 强引用是不会被垃圾收集器自动收集的,除非显式地将引用置为空(null),否则 JVM 将抛出一个 OutOfMemoryError。

#2.软引用: 软引用和强引用有一点区别,在垃圾回收器启动后会判断当前JVM内存是否达到临界值,若达到的话会将软引用所指向的对象清除;否则不会清除。这种引用一般作为内存敏感的缓存来使用。一般在存取文件的时候I/O操作会大大降低系统的运行效率,故将文件直接放在内存中,在需要使用的时候直接调用,但若文件太多获取太大的话那么内存吃紧将会使JVM抛出异常;这个时候就可以使用软引用来指向内存中的文件,在JVM内存不够的时候就将一些软引用指向的文件删除。

软引用的创建方式:

SoftReference<T> sr = new SoftReference<T>(new T());
复制代码

测试:

SoftReference<String> reference = new SoftReference<>(new String("s"));
assertNotNull(reference.get());
System.gc();
assertNotNull(reference.get());
复制代码

#3.弱引用: 弱引用比软引用还要轻量,这种引用指向的对象会在垃圾收集器发生gc的时候清除,无论内存是否够用。

弱引用的创建方式:

WeakReference<T> wr = new WeakReference<T>(new T());
复制代码

测试:

WeakReference<String> reference = new WeakReference<>(new String("s"));
assertNotNull(reference.get());
System.gc();
assertNull(reference.get());
复制代码

#4.幻象:

幻象引用无论在何时调用get()方法返回的都是null值,它的作用一般是来监视这个引用只想的对象何时被垃圾收集器回收,在创建幻象引用的时候往往需要给它初始化一个ReferenceQueue来存放要被垃圾收集器清理的对象。

ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
PhantomReference<Object> pr = new PhantonReference<Object>(new Object(), queue);
复制代码

测试:

ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> reference = new PhantomReference<Object>(new Object(), queue);
assertNull(reference.get());
//assertNull(queue.remove());//如果加上这句代码将会一直阻塞,因为垃圾收集器一直没有启动,幻象没有被加载到队列中,
                            //remove()方法会阻塞到队列中有对象供删除为止
System.gc();
assertNotNull(queue.remove());复制代码

转载于:https://juejin.im/post/5c444ae4e51d4539f51d7700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值