java中有四种引用,它们分别为强引用,软引用,弱引用,虚引用。
我写这篇博客也是为了让自己再次的理解这四引用,费话不多话,我们先来探讨下这四种引用的作用和特点。
强引用(StrongReference), 强引用是我们使用的最常用的一种引用。当我们定义的一个对象具有引用,系统的垃圾回收机制不会将这个对象进行回收,就算内存不足时,系统会抛出OutOfMemoryError内存溢出错误导致系统崩溃,也不会回收。
下面我们举例说明强引用:
MyClassA a = new MyClassA(); //定义一个对象a强引用于MyClassA(),只有a=null时,系统才会进行内存回收。
我们再定义一个对象b, MyClassB b = new MyClassB(a);
以上对象的的引用关系到底是什么样的,我们可以用图说话。
虽然new MyClassB()对象间接引用了new MyClassA(),但它们之间的关系还是强引用。那这种关系在哪体现呢?
首先,如果我们将a=null,系统会不会释放掉new MyClassA()的内存空间呢?这里是不会的。因为我们可以看到new MyClassA()还被其他对象所引用,所以不会被垃圾回收机制给回收了。很多人认为只要把a=null后就万事大吉了,所以我们的程序很容易在这种情况之下产生内在泄漏。
软引用(SoftReference),软引用的一大特点就是如果一个对象具有软引用时,当我们的系统内存足够就不会回收它,但内存不足就会回收它,不像强引用直到系统报错也不会回收。软引用可以配合ReferenceQueue来一起使用,这里就不说了。
如何使用软件引用:
SoftReference sRef; // 这是我们定义的软引用对象
MyObject obj; // 定义的普通对象
obj = sRef.get(); // 从sRef对象不获取对象,可能为空
if(obj == null){
sRef = new SoftReference(new MyObject);
obj = sRef.get(); //这是使用软引用初始化对象obj的一种方式,设计非常巧妙
}
弱引用(WeakReference),特点是当系统找到一个只有弱引用的对象时,系统会直接回收它,所以生命周期很短暂。
如何使用弱引用:
MyObject obj = new MyObject(); // 定义一个强引用
WeakReference wRef = new WeakReference(obj); // 定义一个弱引用
当我们把obj赋空值obj=null,内存回收机制会把内存回收,这一点与上文中强引用最大的区别。虽然new WeakReference()也引用了new Object(),当obj=null时,对于这个弱引用就不管用了,还是进行内存回收。
虚引用(PhantomReference),特点是如果一个对象仅持有虚引用,那么它就和没有任何引用一样。
以上四种引用强引用最常见,其次为弱引用,其他的两种不大常用。
+_+ @a little a day