Java中的四大引用
阿新 • • 發佈:2021-02-05
技術標籤:java
1.強引用
A a =new A();//此為強引用
任何強引用物件都不會被gc回收機制回收
2.軟引用SoftReference
- 一般使用者實現Java物件的快取,快取可以有可以沒有,一般將有用但是非必須的物件用軟引用關聯
- 只要是軟引用關聯的物件,在Java發生記憶體溢位異常之前,會將這些物件列入要回收的範圍,如果回收之後發現記憶體還是不夠,才會丟擲OOM異常
class MyArray{
byte[]bytes=new byte[3*1024*1024];
}
public class TestDemo8 {
public static void main (String[] args) {
//軟引用物件
//引用佇列
ReferenceQueue<MyArray> queue = new ReferenceQueue<>();
//建立一個軟引用物件
SoftReference<MyArray> softReference = new SoftReference<>(new MyArray(), queue);
//獲取軟引用物件
System.out.println(softReference.get ());
//判斷是否被回收
System.out.println(softReference.isEnqueued());
System.gc();
System.out.println(softReference.get());
System.out.println(softReference.isEnqueued());
}
}
此時執行的到結果:
此時由於並沒有修改記憶體,故返回為false。
修改記憶體後,再增加一個3M的陣列,此時執行結果如下:
此時可以得到返回為true,證明前者被垃圾回收。
3.弱引用 WeakReference
- 弱引用是用來一些非必須的物件,比軟引用更弱一些
- 只要是被弱引用關聯的物件,只能夠生存到下一次垃圾回收之前,一旦發生垃圾回收,無論當前記憶體是否夠用,都會回收掉被弱飲用關聯的物件
class Test{
}
public class TestDemo8 {
public static void main(String[] args) {
//弱引用物件
ReferenceQueue<Test> queue = new ReferenceQueue<>();
WeakReference<Test> weakReference = new WeakReference<>(new Test(), queue);
System.out.println(weakReference.get());
//判斷是否被回收
System.out.println(weakReference.isEnqueued());
System.gc();
System.out.println(weakReference.get());
System.out.println(weakReference.isEnqueued());
}
}
執行結果:
只能存活在下次垃圾回收之前。
4.虛引用 PhantomReference
- 別名幽靈引用,最弱的引用關係,一個物件是否具有虛引用的存在,完全是不會對其生命週期產生影響,也無法通過虛引用獲取一個物件的例項,它存在的唯一目的就是在物件被垃圾回收之後收到一個系統通知。