概念介绍

 
1   Reference
     描述一个对象的引用。其内部维持一个queue引用,用于跟踪对象的回收情况,当对象被回收时将当前reference引用入队
 
2   SoftReference
     软引用,仅当JVM内存紧张时会回收关联对象,即JVM在抛出OOM异常之前会回收所有的SoftReference关联的对象。
     在对象被回收之后的某个时间点(立即或延迟)进行入队操作
 
3   WeakReference
     弱引用,当JVM执行垃圾回收时(如System.gc触发)回收其关联对象。
     在对象被回收之后的某个时间点(立即或延迟)进行入队操作
 
4   PhantomReference
     虚引用,实现了延迟可控、可再生(重复使用对象)的回收机制。
     当JVM第一次垃圾回收时并不回收关联对象,而是直接将refercence对象入队;
     当reference对象操作出队(poll)时,其内部Queue对象被置换为一个特殊的NULL队列(不允许入队);
     于是当JVM第二次垃圾回收时尝试将其入队发现失败,于是JVM才将关联对象回收。
     为了保护虚引用对象可再生,该reference的get方法总是返回null。
 

代码示例

package reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference; public class ReferenceTest { public static void main(String[] args) {
System.out.println("弱引用==============");
testWeakReference(); System.out.println("软引用=============="); testSoftReference(); System.out.println("虚引用==============");
testPhantomReference();
} /**
* 测试弱引用
*/
private static void testWeakReference() {
Object obj = new Object(); // 构建弱引用
ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
WeakReference<Object> weakRef = new WeakReference<Object>(obj, refQueue); // 关联对象
System.out.println(weakRef.get());
// 检查入队情况
System.out.println(refQueue.poll());
obj = null;
System.gc(); // 延迟,等待入队操作执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 关联对象是否回收
System.out.println(weakRef.get());
// 是否入队
System.out.println(refQueue.poll());
} /**
* 测试软引用
*/
private static void testSoftReference() {
Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
SoftReference<Object> weakRef = new SoftReference<Object>(obj, refQueue);
// 关联对象
System.out.println(weakRef.get());
// 检查入队情况
System.out.println(refQueue.poll());
obj = null;
System.gc(); // 延迟,等待入队操作执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 关联对象是否回收
System.out.println(weakRef.get());
// 是否入队
System.out.println(refQueue.poll());
} /**
* 测试虚引用
*/
private static void testPhantomReference() {
Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
PhantomReference<Object> weakRef = new PhantomReference<Object>(obj, refQueue);
// 关联对象
System.out.println(weakRef.get());
// 检查入队情况
System.out.println(refQueue.poll());
obj = null;
System.gc(); // 延迟,等待入队操作执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 关联对象是否回收
System.out.println(weakRef.get());
// 是否入队
System.out.println(refQueue.poll()); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("Phantom Reference's referent recycled.");
}
}

  

 
输出
弱引用==============
java.lang.Object@1fb8ee3
null
null
java.lang.ref.WeakReference@14318bb
软引用==============
java.lang.Object@ca0b6
null
java.lang.Object@ca0b6
null
虚引用==============
null
null
null
java.lang.ref.PhantomReference@1b67f74
Phantom Reference's referent recycled.
 

相关博文

 

关于Java的软引用及弱引用的更多相关文章

  1. Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用

    Java中负责内存回收的是JVM.通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题.为了解决内存操作不灵活的问题 ...

  2. java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...

  3. 【转载】 Java 7之基础 - 强引用、弱引用、软引用、虚引用

    原文地址:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一 ...

  4. Java之强引用、 软引用、 弱引用、虚引用

    1.强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它. ...

  5. Java学习之强引用,弱引用,软引用 与 JVM

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

  6. Java 如何有效地避免OOM:善于利用软引用和弱引用

    Java 如何有效地避免OOM:善于利用软引用和弱引用 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引 ...

  7. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  8. Java 7之基础 - 强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object();   //  强引用 当内 ...

  9. Java对象引用/JVM分级引用——强引用、软引用、弱引用、虚引用

    无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与“引用”有关, 相关资料:如何判断对象是否存活/死去 那么引用究竟是什么?让我们一起来看一下 ...

  10. Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

随机推荐

  1. intellij中编译报错: The packaging for this project did not assign a file to the build artifact

    原因是run configuration -> maven -> preject name -> Parameters -> command line中是install:ins ...

  2. java读取配置文件中数据

    Properties pps=new Properties();        try {            pps.load(new FileInputStream("src/emai ...

  3. sqlplus无密码登录TNS协议适配器错误

    登录到sqlplus使用无密码登录用户时出现:TNS协议适配器错误 检查自己是否有多个数据库,可能默认登录的数据库服务没有启动,启动即可. 查看当前数据库名  select name from v$d ...

  4. express-generator安装时出错,最后用VPS解决

    npm install -g express-generator npm ERR! Linux 3.10.0-229.el7.x86_64npm ERR! argv "/usr/local/ ...

  5. Linux vi/vim

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  6. linux 后台运行命令 nohup命令

    转载:http://if.ustc.edu.cn/~ygwu/blog/archives/000538.html 2005年04月18日 简单而有用的nohup命令在UNIX/LINUX中,普通进程用 ...

  7. 0525Scrum项目7.0

    一.Spring1回顾: 在这第一个冲刺中,我们主要是完成了主界面的建立,过程虽然有些曲折,大家有时候找的素材.图片都有一些冲突,但是最后我们还是求同存异,努力地做好界面! 在这一个冲刺中,我们虽然算 ...

  8. Octopus系列之价格计算公式

    百分比:在原价的基础上优惠5%,相当于95%折销售实际价格:最后实际销售的价格[基准价格:如果有特价就基于特价,没有特价基于原价]优惠金额:减少的金额 批量优惠 百分比: 原价*(1-5%)的算法实际 ...

  9. Java:多线程<一>

    程序运行时,其实是CPU在执行程序的进程,为了提高工作效率一个进程可以有多个线程. Java的多线程: 其实我们之前就见过Java的线程,main就是Java的一个线程,还有另一个条线程总是和main ...

  10. 谈谈Javascript的this关键字(this is not this)

    前言: 看文章标题你就知道,这篇文章我只讲一个简单的Javascript的this关键字,说它简单——它又不简单,因为曾几何时我也对this关键字有些困惑,它也确实会让不少程序员感到不解——它像是一个 ...