1)強引用。強引
用是最廣泛的,當一個對象有強引用的的時候,其不會被gc回收,無論內存足夠仍是不足夠。
2)軟引用。SoftReference類,類內包含指定對象的引用,當一個對象只有軟引用的且內存不足的時候,對象會被gc回收,能夠配合ReferenceQueue隊列使用,若對象被回收,則會把SoftReference內指定對象的引用置爲null,SoftReference對象會進入ReferenceQueue,經過對ReferenceQueue使用poll方法來判斷指定對象是否被gc回收。
3)弱引用。WeakReference類,類內包含指定對象的引用,當一個對象只有弱引用的時候,無論內存足仍是不足,都會gc回收,
能夠配合ReferenceQueue隊列使用,
經過對ReferenceQueue使用poll方法來判斷指定對象是否被gc回收,第一次回收會被標記爲垃圾回收,用get有可能獲取到對象,第二次gc會被回收,用get返回空。
當弱引用的指向對象變得弱引用可到達,該弱引用就會加入到引用隊列。這一操做發生在對象析構或者垃圾回收真正發生以前,能夠在不規範的finalize方法裏從新添加指向對象的引用,復活對象。
4)虛引用。PhantomReference類,當一個對象只有弱引用的時候,任什麼時候候都會被gc回收。經過get獲取永遠都爲空。虛引用用來判斷和跟蹤對象是否被回收,並且必須和ReferenceQueue聯合使用。虛引用能夠避免不少析構方法帶來的問題。重寫析構函數,gc第一次會標記其爲垃圾,由於調用析構函數的線程優先級是很低的,故不知道須要通過多少個gc週期才能回收到對象,這就容易發生內存泄漏,使用虛引用則能夠判斷對象是否真正被gc回收,避免這個問題。
II、java引用的場景
1)由於軟引用的特性,在內存不足的時候纔去回收只有軟引用指向的對象,故適合作高速緩存,當用戶去訪問 某些數據時,從數據庫里拉回數據後,創建軟引用會緩存那些常常去查詢的數據(不多改動,如新聞,文章等),當用戶再次去訪問的時候,就從緩存裏獲取,沒必要再從數據庫裏獲取。
2)弱引用
其中一個應用場景是當應用實現了自定義的classLoader,當沒有對象指向classLoader的時候,則回收classLoader。