Java之引用、软引用、弱引用、虚引用

Java之引用、软引用、弱引用、虚引用

强引用(StrongReference)

强引用是开发过程中最常用的引用方式,当一个对象具有强引用时,操作系统进行 GC 回收处理是不会回收强引用的对象,即使系统内存不足,Java虚拟机宁可抛 OutOfMemoryError(内存溢出错误),宁可使程序异常终止,也不会靠回收强引用的对象来解决内存不足的问题。

只要把强引用对象 str 赋空值 null, 该对象就可以被 GC 垃圾回收器回收;因为该对象此时不再含有其他强引用。

// 变量 str 表示强引用,指向 new String("hello") 这个对象
String str = new String("hello"); 

软引用(SoftReference)

当JVM虚拟机内存充足时,软引用对象不会被 GC 垃圾回收器回收。
当JVM虚拟机内存不足时,软引用对象会被 GC 垃圾回收器回收。

未被回收的软引用对象是一直会被程序占有的。

 MySoftObj softObj = new MySoftObj();
 //软引用实例
 SoftReference softRef = new SoftReference(softObj);
 //获取软引用保存的引用
 MySoftObj anotherRef = (MySoftObj) softRef.get();

弱引用(WeakReference)

对于弱引用对象,当操作系统进行 GC 回收处理时,不管内存空间是否足够,弱引用对象都会被回收。
如果一个对象除了具有弱引用还具有强引用,GC回收时,该对象是不会被回收的,操作系统只会回收只具有弱引用的对象。

弱引用常常被用于防止内存泄漏,最常见的是单例和Handler造成的内存泄漏。

MyWeakObj weakObj = new MyWeakObj();
//弱引用实例 
WeakReference weakReference = new WeakReference<>(weakObj); 
//获取弱引用保存的引用 
MyWeakObj anotherRef = weakReference.get(); 

安卓中最常用的就是静态Handler加弱引用。

虚引用(PhantomReference)

虚引用不能保证其保存对象生命周期,若保存对象只有虚引用,则其有效期完全随机于GC的回收,在任何一个不确定的时间内,都可能会被回收;而虚引用与其他几者的引用不同在于,在使用PhantomReference,必须要和Reference联合使用。

MyPhantomObj phantomObj = new MyPhantomObj();
//引用队列 
ReferenceQueue queue = new ReferenceQueue<>(); 
//虚引用 
PhantomReference phantomReference = new PhantomReference(phantomObj, queue); 
//获取虚引用保存的引用 
MyPhantomObj anotherRef = phantomReference .get(); 

你可能感兴趣的:(Java,java,jvm,开发语言)