一、前言
今天我们浅谈一下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);
}
}
接下来我画一下流程的存储图
因为强引用不能被回收,强引用可能导致强占空间不释放,积累的多了内存泄漏会导致内存溢,所以我们为了节约内存,在我们不用了之后可以采取措施帮助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<String> softRef=new SoftReference<String>(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<String> softRef=new SoftReference<String>(src); //软引用
WeakReference<String> wr = new WeakReference<String>(src);//弱引用
// System.out.println(src);
// System.out.println(softRef);
System.out.println(wr);
System.gc();
}
}
该存储主要存储不是特别重要的数据,当我们内存空间不足时,GC会及时回收防止内存溢出。
五、虚引用
1、定义
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。简单来说其存在就是为了将关联虚引用的对象在被GC掉之后收到一个通知。
六、总结
1、Java四种引用级别:强引用、软引用、弱引用和虚引用。(由高到低)
2、生存时间
强引用:JVM停止运行时终止
软引用:内存不足时终止
弱引用:gc运行后终止
虚引用:任何时候都可能