java虛拟機有5個不同級别的對象的可達性。
●強可達(strongly reachable)
如果一個對象可以被一些線程直接使用而不用通過其他引用對象(reference objects),那麼它就是強可達。一個新建立的對象對建立它的線程來講就是強可達的。
這是我們知道并且一直在使用的引用類型(譯注:通常被new出來的對象都是強可達的,他們的引用就是強引用)。任何通過強引用所使用的對象(在一個活動線程中)都不會被gc回收。
●軟可達(softly reachable)
如果一個對象沒有強可達性,但是它可以通過一個軟引用(soft reference.)來使用,那麼它就具有軟可達性。 隻有當系統需要更多記憶體時,gc才會回收具有軟可達性的對象。在記憶體不足前,gc保證一定回收軟可達的對象。
有可能我們會在代碼中寫下這麼幾行:“嘿,我想要把一些資料儲存在記憶體中。但隻要jvm快把記憶體用光的時候,就可以直接将這些東西回收并将這些引用置為null。我會在代碼裡面處理這種情況。”關于軟引用(softreference)何時應該被回收的算法依賴于不同的jvm發行版本。它往往是一個跟引用(reference)的使用頻率和使用間隔有關的函數。
軟引用可用來實作記憶體敏感的高速緩存.但是你懂的,具體的行為還是得依賴于jvm。并且多少跟記憶體回收機制有關,保障很少并且跟具體的jvm發行版本有關。為了緩存的可靠(及其他更多特性),大多數人都會選用像ehcache而不是用軟引用實作自己的緩存。但在一些場合,使用軟引用确實可以讓代碼非常優雅、簡潔。
●弱可達(weakly reachable)
如果一個對象既沒有強可達性,也沒有軟可達性,但是它可以通過一個弱引用(weak reference)來使用,那麼他就具有弱可達性。當弱引用指向的弱可達對象沒有其他的引用,那麼這個對象就會被回收。
弱引用不能阻止垃圾回收機制清理他指向的引用。弱引用最常見的使用情景是通過weakhashmap。它是一種簡單地将對象的生命周期跟map中對象的索引域(key)綁定的方式。隻有當weakhashmap中的key是強可達,也就是weakhashmap中的資料域(data域)的對象,在應用程式的其他地方有别的引用的時候,它裡面的值才不會被回收。一旦應用程式中沒有其他對weakhashmap中對象的引用,那麼它的所有的key就會變成弱可達,不需要使用者的額外幹預,所有weakhashmap中的對象都會被清除。這是一種優雅地防止記憶體洩露的方式。
●虛可達(phantom reachable)
如果一個對象既沒有強可達性,也沒有軟可達性、弱可達性,他已經被終結(finalized),并且有一些虛引用(phantom reference)指向它,那麼它就具有虛可達性。
虛引用(phantomreference)指向的對象是不能被取回使用的。它的get()方法永遠傳回null,是以它有什麼用呢?
所有的引用類型都允許在構造函數中指定一個引用隊列(referencequeue)。從語義上講一個虛引用(phantomreference)以什麼方式、何時入隊讓對象終結(finalization)以一種更好、更健壯的方式進行。
●不可達(unreachable)
當一個對象不能通過以上的方式指向,那麼這個對象就變得不可達,并是以适合被回收。
本文翻譯自:
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/kissazi2/p/3619139.html