java:強引用,軟引用,弱引用和虛引用
強引用
如果一個物件具有強引用,垃圾回收器絕不會回收它.當記憶體空間不足時,java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足問題.
軟引用 SoftReference<T>
如果記憶體空間充足,垃圾回收器就不會回收它;如果記憶體空間不足,就會回收這些物件的記憶體.只要垃圾回收器沒有回收它,該物件就可以繼續被應用程式使用.軟引用可以實現記憶體敏感的快取記憶體.
弱引用 Weakreference<T>
只具有弱引用的物件具有更短的生命週期.在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體.不過,垃圾回收器是一個優先順序很低對的執行緒,因此不一定會很快發現那些只具有弱引用的物件.
虛引用 PhantomReference<T>
虛引用並不會決定物件的生命週期.如果一個物件僅持有虛引用,那麼他就和沒有任何引用一樣,在任何時候都可能被回收.
引用佇列 ReferenceQueue<T>
引用佇列可以和軟引用,弱引用和虛引用聯合使用.並且虛引用必須和引用佇列聯合使用.如果軟引用(弱引用或者虛引用)所引用的物件被垃圾回收,java虛擬機器就會把這個引用加入到與之關聯的引用佇列中.
String reference = "hello"; //引用佇列 ReferenceQueue<String> queue = new ReferenceQueue<>(); //弱引用 WeakReference<String> softReference = new WeakReference<String>(reference,queue); reference = null; //取出弱引用持有的String物件 String str = softReference.get(); //取出引用佇列中儲存的引用物件 Reference<? extends String> poll = queue.poll();