1、強引用
如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。
String str = "hello"; // 強引用 str = null; // 取消強引用
2、軟引用
在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收;只有在內存空間不足時,軟引用才會被垃圾回收器回收。
SoftReference<String> softName = new SoftReference<>("張三");
3、弱引用
具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由於垃圾回收器是一個優先級較低的線程,所以並不一定能迅速發現弱引用對象。
WeakReference<String> weakName = new WeakReference<String>("hello");
4、虛引用
顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那么它相當於沒有引用,在任何時候都可能被垃圾回收器回收。
虛引用必須和引用隊列關聯使用,當垃圾回收器准備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。
ReferenceQueue<String> queue = new ReferenceQueue<String>(); PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);