博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java当中强引用、软引用、弱引用及虚引用
阅读量:4148 次
发布时间:2019-05-25

本文共 1737 字,大约阅读时间需要 5 分钟。

java当中提供了四种类型的引用,分别是强引用、软引用、弱引用和虚引用,java当中提供这些类型的引用,主要是为了方便在垃圾回收时,将不需要的对象清理掉,从而不至于引发OOM异常错误。

强引用

    在我们前面介绍java当中对象的生命周期时,如果一个对象有强引用关系,那么将不会被垃圾回收收走,哪怕是抛出OOM异常,也不会回收。通常我们通过new 的方式创建的引用,都是强引用关系

Object obj = new Object();String str = "abc";

    如果想要中断某个强引用和对象之间的关联,只需要把对象指向null, 这样在垃圾回收时,就会把之前的对象的内存空间清理掉

软引用(soft Reference)

    在java当中可以通过new SoftReference的方式来创建一个软引用,软引用主要是在内存空间不足的情况,垃圾回收会把软引用关联的引用回收掉,

软引用提供的两个方法

public SoftReference(T referent) {    super(referent);    this.timestamp = clock;    } public SoftReference(T referent, ReferenceQueue
q) { super(referent, q); this.timestamp = clock; }

软引用可以和一个ReferenceQueue关联,如果这个软引用所引用的对象被JVM回收走了,引用对象会被加入到与之关联的引用队列当中

适用场景:用来缓存一些数据,比如图片信息等

弱引用(weakReference)

    弱引用所包含的对象,在JVM进行垃圾回收时,不管内存是否充足都会被回收掉,弱引用的提供的两个构造方法

public class WeakReference
extends Reference
{ public WeakReference(T referent) { super(referent); } public WeakReference(T referent, ReferenceQueue
q) { super(referent, q); }}
   
与弱引用相关联的引用如果被垃圾回收收走之后,弱引用的对象会放在对应的队列当中去
    java当中常见的就是ThreadLocal当中的使用ThreadLocalMap来保存threadLocal和对应的value值,其中threadLocalMap当中的key 就是threadLocal的弱引用。

    适用场景,比如需要将产品信息保存在Map当中,map的key我们一般使用product来表示,当product对象被销毁后,但是map当中却维护了强引用,一直都不能被回收,这个时候最好在map当中保存product的弱引用来作为key, 当然也可以使用java自带的WeakHashMap

虚引用(phantomReference)

    虚引用并不影响对象的生命周期,如果一个对象和虚引用关联,等于没有和任何对象关联一样,可以在任何时候都有可能被回收走。

    要注意的是,虚引用必须和引用队列关联,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列当中,程序可以通过判断引用队列是否加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象被回收之前采取必要的行动。

public class PhantomReference
extends Reference
{ public T get() { return null; } public PhantomReference(T referent, ReferenceQueue
q) { super(referent, q); }}

转载地址:http://olvti.baihongyu.com/

你可能感兴趣的文章
文件上传时生成“日期+随机数”式文件名前缀的Java代码
查看>>
Java代码检查工具Checkstyle常见输出结果
查看>>
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
CORBA links
查看>>
如何使用BBC英语学习频道
查看>>
初识xsd
查看>>
java 设计模式-职责型模式
查看>>
构造型模式
查看>>
svn out of date 无法更新到最新版本
查看>>
java杂记
查看>>
RunTime.getRuntime().exec()
查看>>