四种引用:强弱软虚

强引用:使用强引用,在内存不足的时候垃圾处理器也不会回收他,哪怕导致程序崩溃 例如: A a=new A()

软引用:内存不足的时候会被回收(软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。)————一般用来构建敏感信息的缓存

弱引用:只要垃圾处理去扫描到有弱引用对象,内存足不足都要被回收(可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。)

虚引用:任何时候都会被回收,形同虚设(而且必须要和引用队列联合使用)

弱引用:(非必需对象)

import java.lang.ref.WeakReference;

public class Main {

    public static void main(String[] args) {

        WeakReference<String> sr = new WeakReference<String>(new String("hello"));

        System.out.println(sr.get());

        System.gc();                //通知JVM的gc进行垃圾回收

        System.out.println(sr.get());

    }

}

输出 hello null

软引用的使用:

SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。 看下面代码:

MyObject aRef = new MyObject();

SoftReference aSoftRef=new SoftReference(aRef); 
此时,对于这个MyObject对象,有两个引用路径,一个是来自SoftReference对象的软引用,一个来自变量aReference的强引用,所以这个MyObject对象是强可及对象。 随即,我们可以结束aReference对这个MyObject实例的强引用:

aRef = null;

此后,这个MyObject对象成为了软可及对象。如果垃圾收集线程进行内存垃圾收集,并不会因为有一个SoftReference对该对象的引用而始终保留该对象。Java虚拟机的垃圾收集线程对软可及对象和其他一般Java对象进行了区别对待:软可及对象的清理是由垃圾收集线程根据其特定算法按照内存需求决定的。也就是说,垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软可及对象,而且虚拟机会尽可能优先回收长时间闲置不用的软可及对象,对那些刚刚构建的或刚刚使用过的“新”软可反对象会被虚拟机尽可能保留。在回收这些对象之前,我们可以通过: MyObject anotherRef=(MyObject)aSoftRef.get(); 
重新获得对该实例的强引用。而回收之后,调用get()方法就只能得到null了。 3 使用ReferenceQueue清除失去了软引用对象的SoftReference 作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。所以,当软可及对象被回收之后,虽然这个SoftReference对象的get()方法返回null,但这个SoftReference对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量SoftReference对象带来的内存泄漏。在java.lang.ref包里还提供了ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如:

ReferenceQueue queue = new ReferenceQueue();



SoftReference ref=new SoftReference(aMyObject, queue);

那么当这个SoftReference所软引用的aMyOhject被垃圾收集器回收的同时,ref所强引用的SoftReference对象被列入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的对象的Reference对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。
在任何时候,我们都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。利用这个方法,我们可以检查哪个SoftReference所软引用的对象已经被回收。于是我们可以把这些失去所软引用的对象的SoftReference对象清除掉。常用的方式为:

SoftReference ref = null;

while ((ref = (EmployeeRef) q.poll()) != null) {

// 清除ref

}

最新文章

  1. word文档的生成、修改、渲染、打印,使用Aspose.Words
  2. js控制iframe跳转
  3. 边工作边刷题:70天一遍leetcode: day 78
  4. 从投影的角度理解pca:向量,投影,基,内积,坐标,维数,分散程度,方差,协方差矩阵,对角化,特征值分解,主成分分析PCA
  5. c# Aes加解密和对象序列化
  6. debug.keystore文件不存在解决办法
  7. Android原理View、ViewGroup
  8. 记录一下C#+Oracle批量插入的一个方法
  9. JAVA定时任务实现的几种方式
  10. php的依赖注入容器
  11. 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例
  12. SQL注入之Sqli-labs系列第三十关(基于WAF防护的双引号报错注入)和三十一关
  13. SpringBoot 三种方式配置 Druid(包括纯配置文件配置)
  14. DLL断点调试
  15. RESET MASTER和RESET SLAVE使用场景和说明,以及清除主从同步关系
  16. Chrome控制台格式化输出
  17. codeforces水题100道 第二十三题 Codeforces Beta Round #77 (Div. 2 Only) A. Football (strings)
  18. .apk等常用文件下载出现如果应下载文件,请添加 iis MIME 映射。
  19. Mongo副本集的配置以及php node.js连接使用副本集
  20. 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】

热门文章

  1. Hashtable元素的遍历
  2. solidity数据类型
  3. (三)PHP网页架站
  4. 关于meta标签中的http-equiv属性使用介绍
  5. Linux 套接字编程 - select
  6. ZROJ#398. 【18提高7】随机游走(期望dp 树形dp)
  7. 关于datagridview中checkbox列在选中行的情况下无法操作值
  8. jscode属性排序
  9. mysql的sql_mode介绍和修改
  10. WebService小例子———