`
wangleyiang
  • 浏览: 215433 次
社区版块
存档分类
最新评论
阅读更多

    Java中的引用方式有StrongReference, SoftReference, WeakReference和PhantomReference。先来看一个来mindprod 的一个图表:

Soft vs Weak vs Phantom References Type Purpose Use When GCed Implementing Class
Strong Reference An ordinary reference. Keeps objects alive as long as they are referenced. normal reference. Any object not pointed to can be reclaimed. default
Soft Reference Keeps objects alive provided there’s enough memory. to keep objects alive even after clients have removed their references (memory-sensitive caches), in case clients start asking for them again by key. After a first gc pass, the JVM decides it still needs to reclaim more space. java.lang.ref. SoftReference
Weak Reference Keeps objects alive only while they’re in use (reachable) by clients. Containers that automatically delete objects no longer in use. After gc determines the object is only weakly reachable java.lang.ref. WeakReference
java.util. WeakHashMap
Phantom Reference Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use of finalize ()) Special clean up processing After finalization. java.lang.ref. PhantomReference

 

    1、StrongReference: 是Java中默认的引用方式。当它指向某个对象时,该对象不会被回收;当它不再指向该对象,且该对象没有其它的引用指向时,在GC被执行后,可以回收该对象所占用内存。

    代码示例1:

		// 在栈内存创建Object的引用
		Object object = null;
		// 在堆内存创建Object对象,并使object引用指向刚刚创建的Object对象
		object = new Object();

     执行完上述代码,内存分布如下图:



     如果此时系统调用GC,object指向的对象不会被回收。

 

    代码示例2:

// 断开引用
object = null;
 

     执行完上述代码,内存分布如下图:



    如果此时系统调用GC,断开object指向前的那个对象会被回收。

 

     2、SoftReference: 当JVM内存不足时,SoftReference指向的对象会被回收。这样的特性,使得SoftReference适合应用到缓存操作。

    使用方式:

		Object object = new Object();
		SoftReference<Object> softRerference = new SoftReference<Object>(object);
		object = null;

 

    3、WeakReference: 当所引用的对象不再有强引用时, 系统调用GC后,该对象会被回收。使用方法类似SoftReference。WeakHashMap的key的类型是WeakReference, 如果没有指向key的强引用,在系统调用GC后,WeakHashMap会删除相关的value对象并回收。

    代码示例:

		// 创建并指向WeakHashMap
		Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();
		
		// 创建并指向key
		Object key = new Object();
		
		// 创建并指向value
		Object value = new Object();
		
		// 添加key-value对到WeakHashMap
		weakHashMap.put(key, value);
		
		// 断开key的强引用
		key = null;
 

    4、PhantomReference: 注意它与finalize方法调用的时机。

    5、多说一句 :这些引用方式都具有自己的特性,根据它们的特性完成某个特定的功能!:)

 

  • 大小: 11 KB
  • 大小: 10 KB
分享到:
评论

相关推荐

    Java的四种引用

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

    浅谈Java中的四种引用方式的区别

    下面小编就为大家带来一篇浅谈Java中的四种引用方式的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java的传值与传引用详解

     Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。  简单的说,引用其实就像是一个对象的名字...

    C#调用JavaWebService

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...

    java源码包---java 源码 大量 实例

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA_API1.6文档(中文)

    java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度...

    Java停车场收费管理系统(毕设).zip

    大二下学期的web应用课程设计,采用MVC设计模式,数据库采用MYSQL,采用数据源的方式连接,若引用记得配置好自己的数据库。 Java停车场收费管理系统(毕设) 大二下学期的web应用课程设计,采用MVC设计模式,...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    java及C++中传值传递、引用传递和指针方式的理解.docx

    Java调用ILOG规则集的两种实现

    两种方式实现java调用ILOG规则集。

    详解Java的四种引用方式及其区别

    主要介绍了Java的四种引用方式 ,主要主要包括强引用,软引用,弱引用,虚引用,稍微整理精简一下做下分享,具有一定的参考价值,需要的朋友可以参考下

    Java 接口.pdf Java面向对象设计 - Java接口 什么是接口? Java中的接口定义了一个引用类型来创建抽象概念

    Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间的关系...

    Java 1.6 API 中文 New

    java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度...

    java源码包4

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    java源码包3

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA上百实例源码以及开源项目源代码

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    Java传参方式-值传递还是引用传递

    参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行为而导致的...

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    java源码包2

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

Global site tag (gtag.js) - Google Analytics