Java 引用方式

本文介绍了Java中的四种引用类型:StrongReference、SoftReference、WeakReference和PhantomReference的特点及应用场景。包括它们如何帮助对象存活、用于缓存操作、自动删除不再使用的对象以及在对象被垃圾回收前进行清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Soft vs Weak vs Phantom References
TypePurposeUseWhen GCedImplementing Class
Strong ReferenceAn ordinary reference. Keeps objects alive as long as they are referenced.normal reference.Any object not pointed to can be reclaimed.default
Soft ReferenceKeeps 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 ReferenceKeeps 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 ReferenceLets you clean up after finalization but before the space is reclaimed (replaces or augments the use of finalize ())Special clean up processingAfter 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、多说一句 :这些引用方式都具有自己的特性,根据它们的特性完成某个特定的功能!:)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值