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
分享到:
相关推荐
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
下面小编就为大家带来一篇浅谈Java中的四种引用方式的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。 简单的说,引用其实就像是一个对象的名字...
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度...
大二下学期的web应用课程设计,采用MVC设计模式,数据库采用MYSQL,采用数据源的方式连接,若引用记得配置好自己的数据库。 Java停车场收费管理系统(毕设) 大二下学期的web应用课程设计,采用MVC设计模式,...
java及C++中传值传递、引用传递和指针方式的理解.docx
两种方式实现java调用ILOG规则集。
主要介绍了Java的四种引用方式 ,主要主要包括强引用,软引用,弱引用,虚引用,稍微整理精简一下做下分享,具有一定的参考价值,需要的朋友可以参考下
Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间的关系...
java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行为而导致的...
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...