当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

Java四种引用类型

作者:小梦 来源: 网络 时间: 2024-07-03 阅读:

Java四种引用类型

在java中,类型就分为两种,基本类型和引用类型或自定义类型。

引用类型又分为四种:

  1. 强引用 StrongReference

  2. 软引用 SoftReference

  3. 若引用 WeakReference

  4. 虚引用 PhantomReference

划分这些类型的目的是:是为了更灵活的管理对象的生命周期,让垃圾器在最合适的适合回收对象。虽然,我们在实际业务中很少用到这些知识,但是很有必要了解到这些,去帮助我们去做些程序性能优化。

强引用

强引用就是直接引用对象比如下面这样,我们在编写程序时,用到的大多都是强引用

StringBuffer b1 = new StringBuffer("hello world");

强引用对象,当垃圾回收进行时,不会被回收,及时通过b1 = null;释放引用,在资源充足时,也不会被垃圾回收立刻回收。如果内存吃紧,Java虚拟机会抛出OutOfMemoryError错误,使程序异常终止,不会靠随意回收具有强引用的对象来解决内存不足的问题。

软引用

SoftReference<StringBuffer> softReference = new SoftReference<StringBuffer>(new StringBuffer("hello world"));System.gc();System.out.print(softReference.get()); // 只有当内存吃紧时,发生gc后,会报Exception in thread "main" java.lang.NullPointerException,

软引用的生命周期会比强引用弱点,在内存空间足够时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

使用案列:common-pool2中对对象池中的对象的管理,当某些对象没有引用时,方便垃圾器及时回收。

弱引用

WeakReference<StringBuffer> weakReference = new WeakReference<StringBuffer>(new StringBuffer("hello world"));WeakReference<StringBuffer> weakReference2 = new WeakReference<StringBuffer>(new StringBuffer("hello world"));System.out.print(weakReference.get()); //  hello worldStringBuffer buffer = weakReference2.get();System.gc();System.out.print(weakReference.get()); // Exception in thread "main" java.lang.NullPointerExceptionSystem.out.print(weakReference2.get()); //  hello world

弱引用会在发生gc时,没有对象在去引用时会被立刻被回收,不管内存是否充裕。

使用案列:WeakHashMap

虚引用

ReferenceQueue<StringBuffer> stringBufferReferenceQueue = new ReferenceQueue<StringBuffer>();PhantomReference<StringBuffer> phantomReference = new PhantomReference<StringBuffer>(new StringBuffer("hello world"), stringBufferReferenceQueue);System.out.print(phantomReference.get());Exception in thread "main" java.lang.NullPointerException

虚引用,不顾是否被垃圾回收,都不可以拿到真正的引用对象。一般用法是
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

具体Demo代码请参照:ReferenceDemo

热点阅读

网友最爱