Java中的强引用、软引用、弱引用与虚引用

一、前言

今天我们浅谈一下java的四种引用,分别是强引用、软引用、弱引用与序引用。在谈引用之前我们不得不提一下Java的垃圾回收器机制GC,GC算是Java的一大特点,我们都知道c语言是不能自动释放内存的需要程序员去操作的,而Java自带的垃圾回收机制是能够帮助程序员自动释放内存的。

所以在了解四种引用之前我们先了解一下GC

GC:是Java自带的垃圾回收器,它是运行在独立的,优先级比较低的线程中,时刻都在检测与释放无用的内存,那是如何判断它是否有用,主要用的较多的判断方式就是引用计数

JDK1.2版本以前:当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。简单来说:就是当我们一直在用那么它就一直有效,当我们不用了就会被回收掉,在想用就不可能了。

JDK1.2版本之后:Java就提出了四种引用,更加方便我们去管理这些内存,同时可以让程序员通过代码的方式决定某些对象的生命周期。

二、强引用

1、定义

强引用是Java中的默认类型,当一个对象如果具有强引用,只要这种引用还存在,就不会被GC回收,甚至当内存不够时,就算抛出异常也不会对其进行回收。

2、代码

public class Tests {
	public static void main(String[] args) {
		String src = new String("我是强引用");
		System.out.println(src);
	}
}

接下来我画一下流程的存储图 

Java中的强引用、软引用、弱引用与虚引用_第1张图片

 因为强引用不能被回收,强引用可能导致强占空间不释放,积累的多了内存泄漏会导致内存溢,所以我们为了节约内存,在我们不用了之后可以采取措施帮助GC回收。

src=null;//帮助垃圾收集器回收此对象,这样就能预防Java虚拟机抛出OutOfMemoryError错误

 三、软引用

1、定义

如果一个对象具有软引用的,在JVM发生OOM之前,(即内存充足的使用)是不会被GC,只有到JVM内存不足时,才会被GC。

2、代码

import java.lang.ref.SoftReference;

public class Tests {
	public static void main(String[] args) {
		String src = new String("我是强引用");
		SoftReference softRef=new SoftReference(src); 
		System.out.println(src);
		System.out.println(softRef);
	}
}

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

提到软引用就不能不提软引用在实际中重要的应用

例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

(1)如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建

(2)如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出

四、弱引用

1、定义

如果一个对象只具有弱引用,那么这个对象就会被GC掉,被弱引用所引用的对象只能生存到下一次GC之前,当发生GC的时候无论当前内存是否足够,弱引用所引用的对象都会被GC掉。

2、代码

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class Tests {
	public static void main(String[] args) {
		String src = new String("我是强引用");
		SoftReference softRef=new SoftReference(src); //软引用
		WeakReference wr = new WeakReference(src);//弱引用
//		System.out.println(src);
//		System.out.println(softRef);
		System.out.println(wr);
		System.gc();
	}
}

该存储主要存储不是特别重要的数据,当我们内存空间不足时,GC会及时回收防止内存溢出。

五、虚引用

1、定义

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。简单来说其存在就是为了将关联虚引用的对象在被GC掉之后收到一个通知。

六、总结

1、Java四种引用级别:强引用、软引用、弱引用和虚引用。(由高到低)

2、生存时间

强引用:JVM停止运行时终止

软引用:内存不足时终止

弱引用:gc运行后终止

虚引用:任何时候都可能

你可能感兴趣的:(java,弱引用)