1、强引用(StrongReference)

    强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型。举个例子来说:
    Object obj = new Object();
    这里的obj引用便是一个强引用,不会被GC回收。

  2、软引用(SoftReference)

    软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收,正是由于这种特性软引用在caching和pooling中用处广泛。软引用的用法:

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference(obj);
// 使用 softRef.get() 获取软引用所引用的对象
Object objg = softRef.get();

  3、弱引用(WeakReference)

    当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。

  4、虚引用(PhantomReference)

    当GC一但发现了虚引用对象,将会将PhantomReference对象插入ReferenceQueue队列,而此时PhantomReference所指向的对象并没有被GC回收,而是要等到ReferenceQueue被你真正的处理后才会被回收。虚引用的用法:

package com.asiainfo.proxydemo;import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;public class SoftReferenceDemo {//软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收,正是由于这种特性软引用在caching和pooling中用处广泛。软引用的用法public static void soft(){Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();SoftReference<Object> softRef = new SoftReference<Object>(obj, refQueue);System.out.println(softRef.get()); // java.lang.Object@f9f9d8System.out.println(refQueue.poll());// null// 清除强引用,触发GCobj = null;System.gc();System.out.println(softRef.get());try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(refQueue.poll());}//当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。public static void weak(){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();System.out.println(weakRef.get());System.out.println(refQueue.poll());}// 如果obj被置为null,当GC发现了虚引用,GC会将phanRef插入进我们之前创建时传入的refQueue队列// 注意,此时phanRef所引用的obj对象,并没有被GC回收,在我们显式地调用refQueue.poll返回phanRef之后// 当GC第二次发现虚引用,而此时JVM将phanRef插入到refQueue会插入失败,此时GC才会对obj进行回收public static void phantom() throws InterruptedException{Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();PhantomReference<Object> phanRef = new PhantomReference<Object>(obj, refQueue);/// 调用phanRef.get()不管在什么情况下会一直返回nullSystem.out.println(phanRef.get());System.out.println(refQueue.poll());obj = null;System.gc();System.out.println(phanRef.get());System.out.println(refQueue.poll());Thread.sleep(300);System.out.println(refQueue.poll());}public static void main(String[] args) {try {SoftReferenceDemo.phantom();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

弱引用与虚引用的用处

  软引用很明显可以用来制作caching和pooling,而弱引用与虚引用呢?其实用处也很大,首先我们来看看弱引用,举个例子:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( object );}
}

所有我添加进 registeredObjects 中的object永远不会被GC回收,因为这里有个强引用保存在registeredObjects里,另一方面如果我把代码改为如下:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( new WeakReference(object) );}}

现在如果GC想要回收registeredObjects中的object,便能够实现了,同样在使用HashMap如果想实现如上的效果,一种更好的实现是使用WeakHashMap。

而虚引用呢?我们先来看看javadoc的部分说明:

Phantom references are useful for implementing cleanup operations that are necessary before an object gets garbage-collected. They are sometimes more flexible than the finalize() method.

翻译一下:

虚引用在实现一个对象被回收之前必须做清理操作是很有用的。有时候,他们比finalize()方法更灵活。

很明显的,虚引用可以用来做对象被回收之前的清理工作

参考:http://www.cnblogs.com/newcj/archive/2011/05/15/2046882.html

Java 中的 Reference相关推荐

  1. java中date类型如何赋值_一文读懂java中的Reference和引用类型

    简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...

  2. java中的Reference类型

    本文简要总结java中的Reference类型. 最近在研读jdk并发框架,其中AQS是重点,由于我打破砂锅问到底的轻微强迫症,google了AQS作者Doug Lea的论文原文[The java.u ...

  3. java什么是reference_如何理解java中的Reference和引用类型?正确的案例讲解

    java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟java垃圾 ...

  4. 一文读懂java中的Reference和引用类型

    简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...

  5. java中的4种reference的差别和使用场景(含理论、代码和执行结果)

    转:https://blog.csdn.net/aitangyong/article/details/39453365 我们知道java语言提供了4种引用类型:强引用.软引用(SoftReferenc ...

  6. Java功底之Reference

    看了这篇文章,相信大家一定回对Java的参数传递熟练掌握,不会再对应用莫名其妙了. JAVA的参数传递,基本类型是把实参赋给形参, 对象是COPY一个副本堆栈里. 很多Java程序员只求追随新生的事物 ...

  7. Java 中的参数传递和引用类型

    本文主要分三部分介绍 Java 中的值.指针与引用的概念. 第一部分从编程语言的三种参数传递方式入手,阐释"为什么 Java 中只有值传递". 第二部分排除自动装箱和自动拆箱的干扰 ...

  8. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  9. 深入理解java中的Soft references amp;amp; Weak references amp;amp; Phantom reference

    引言 Ethan Nicholas 在他的一篇文章中说:他面试了20多个Java高级工程师,他们每个人都至少有5年的Java从业经验,当他问这些工程师对于Weak References 的理解时,只有 ...

最新文章

  1. 后台开发经典书籍--深入理解Nginx模块开发与架构
  2. caffe网络结构图绘制
  3. Apache Beam的API设计
  4. LeetCode(476)——数字的补数(JavaScript)
  5. CSS3新属性:在网站中使用访客电脑里没有安装的字体
  6. 关于CDC在非控件类中的使用
  7. android自动开关机软件,AutoOff(定时关机软件)
  8. xshell如何设置选中复制_Xshell
  9. 均匀分布产生高斯分布
  10. WIN7 64位 VS2013下载
  11. Bitbucket Cloud recently stopped supporting account passwords for Git authen报错解决
  12. Linux下 df 命令查看磁盘空间
  13. [论文笔记]Outfit Compatibility Prediction and Diagnosis with Multi-Layered Comparison Network
  14. ALexa网站排名查询
  15. JS中attr和prop区别
  16. [ARC086]F - Shift and Decrement 位运算+数论+DP
  17. 修改Windows10的主题色(文件夹也会改变)
  18. Google新版第三方登录(Javascript SDK)
  19. 金蝶首席用户体验官对“用户体验”的思考
  20. js高级程序设计(一) —— js简介

热门文章

  1. java学习(99):车站卖票问题
  2. exp/imp和expdp/impdp在功能上的区别:
  3. mysql batis传多个参数_Mybatis传多个参数(三种解决方案)
  4. GitHub上有哪些比较好的计算机视觉/机器视觉的项目?
  5. 3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下
  6. 如何实现一个符合泊松分布的即时消息发生器?
  7. Windows10远程报错:由于CredSSP加密Oracle修正
  8. linux/unix下setuid/seteuid/setreuid/setresuid
  9. 服务器操作系统的安装步骤,服务器操作系统的安装步骤
  10. 本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...