強引用 :
A a = new A () ;
這就是強引用,只有a = null 或者a 不在指向堆中的 a 對象, a對象纔會被jvm 回收
軟引用 :
當內存容量不夠時,隨時可能被回收,當內存容量足夠的時候不會被回收的一種引用.主要用來做緩存使用.
比如
public static void main(String[] args) {
// -Xmx20M jvm 分配20M運行內存
SoftReference<byte[]> demo = new SoftReference<>(new byte[1024 * 1024 * 10]);
System.out.println(demo.get());
System.gc();
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(demo.get());
// 在分配15M內存,這個時候, 軟引用就會被回收
byte[] bb = new byte[1024 * 1024 * 15];
System.out.println(demo.get());
}
先分配一個10M的byte[],使用的是軟引用,當後面再分配一個15M的內存的時候,軟引用就會被回收
運行結果:
[B@515f550a
[B@515f550a
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.improve.soft.T_SoftReference.main(T_SoftReference.java:20)
理論結果應該是:
[B@515f550a
[B@515f550a
null
(這個沒驗證成功,會發生OOM,但是如果把內存調至25或者以上的時候,纔會被回收.馬士兵的視頻是這麼講解和驗證的,姑且先這麼理解,如果有知道原因的,歡迎評論.)
這裏面的byte[] 就是一個軟引用
弱引用:
當垃圾回收時, 不管內存空間是否充足,都會被回收弱引用對象
public static void main(String[] args) {
WeakReference<Demo> demo = new WeakReference<>(new Demo());
System.out.println(demo.get()); // com.improve.Demo@515f550a
System.gc();
System.out.println(demo.get()); // null
}
TreadLocal中使用的就是弱引用
虛引用:
這個引用有跟沒有一樣,隨時都可能被回收,不影響對象的生命週期,主要用來監控對象被垃圾回收活動,與軟引用和弱引用的區別時,虛引用必須和引用隊列(ReferenceQueue)一起使用.一般用於直接內存操作的對象(NIO, Netty zore copy 使用到)