java對象四種引用原理

I、java對象引用的介紹
jdk1.2以前,當對象沒有指向它的引用的時候,這個對象就會被gc回收,但有時候咱們須要拿回來使用,又沒有了其引用,只能從新構建一個對象,若優化的話就作HashMap去緩存到內存,但若對象構建消耗的代價高或者數量比較多的時候,內存就oom。jdk1.2後,java把對象的引用分爲了4種級別,使得程序可以靈活的控制對象的生命週期:
    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。


相關文章
相關標籤/搜索