Java學習筆記10,java學習筆記
當程式建立對象、數組等參考型別實體時,系統都會在堆記憶體中為之分配一塊記憶體區,對象就儲存在這塊記憶體區,
當我們建立的對象不再被引用時,所在的記憶體就變成了垃圾,最後等待記憶體回收機制進行回收,Java的記憶體回收機
制具有以下特徵:
1、記憶體回收機制只負責回收堆記憶體中的對象,不會回收任何實體資源,比如資料庫連接、網路IO等資源。
2、程式無法精確控制記憶體回收的運行,記憶體回收會在合適的時候進行,當對象永久性的失去引用後,系統就會在
合適的時候回收它所佔的記憶體。
3、在記憶體回收機制回收任何對象之前,總會先調用它的finalize()方法,該方法讓一個引用變數重新引用該對象,從
而導致記憶體回收機製取消回收。
當一個對象在堆記憶體中運行時,根據它被引用變數所引用的狀態,可以把它所處的狀態分成以下三種:
1、可達狀態:當一個對象建立後,若有一個以上的引用變數引用它,則這個對象在程式中處於可達狀態,程式可
通過引用變數來調用該對象的Field和方法。
2、可恢複狀態:如果程式中某個對象不再有任何引用變數引用它,它就進入了可恢複狀態,在這種狀態下,系統
的記憶體回收機制準備回收該對象所佔的記憶體,在回收該對象之前,系統會調用所有可恢複狀態物件的finalize()方法
進行資源清理。如果系統在調用finalize()方法時重新讓一個引用變數引用該對象,則這個對象會再次變為可達狀
態;否則該對象將進入不可達狀態。
3、不可達狀態:當對象與所有引用變數的關聯都被切斷,且系統已經調用所有對象的finalize()方法後依然沒有使該
對象變成可達狀態,那麼這個對象將永久性的失去引用,最後變成不可達狀態,當一個對象處於不可達狀態時,系
統才會真正回收該對象所佔的記憶體。
對大部分對象而言,程式裡會有一個引用變數引用該對象,這時最常見的引用方式,除此之外,java.lang.ref包下提
供了3個類:SoftReference、PhantomReference和WeakReference,它們分別代表了系統對對象的3種引用方
式:軟引用、虛引用和弱引用,Java對對象的引用有如下4中方式:
1、強引用:這是Java程式中最常見的引用方式,程式建立一個對象,並把這個對象賦給一個引用變數,程式通過
該引用變數來操作實際的對象。當一個對象被一個或一個以上的引用變數所引用時,它處於可達狀態,不可能被系
統記憶體回收機制回收。
2、軟引用:軟引用需要通過SoftReference類來實現,當一個對象只有軟引用時,它有可能會被記憶體回收機制回
收,對於只有軟引用的對象而言,當系統記憶體空間足夠時,它不會被系統回收,程式也可使用該對象,當系統記憶體
空間不足時,系統可能回收它。軟引用通常用於對記憶體敏感的程式中。
3、弱引用:弱引用時通過WeakReference類實現,弱引用和軟引用很像,但弱引用的引用層級更低,對於只有弱
引用的對象而言,但系統記憶體回收機制運行時,不管系統記憶體是否足夠,總會回收該對象所佔用的記憶體。當然,並
不是說當一個對象只有弱引用時,它就會立即被回收。
4、虛引用:虛引用時通過PhantomReference類實現,虛引用完全類似於沒有引用。虛引用對對象本身沒有太大影
響,對象甚至感覺不到虛引用的存在。如果一個對象只有一個虛引用時,那麼它和沒有引用的效果大致相同。虛引
用主要用於跟蹤對象被記憶體回收的狀態,虛引用不能單獨使用,虛引用必須和引用隊列(ReferenceQueue)聯合使
用。
引用對象由java.lang.ref.ReferenceQueue類表示,它用於儲存被回收後對象的引用,當聯合使用軟引用、弱引用和
引用隊列時,系統在回收被引用的對象之後,將把被回收對象對應的引用添加到關聯的引用隊列中。與軟引用和弱
引用不同的是,虛引用在對象被釋放之前,將把它對象的虛引用添加到它關聯的引用隊列中,這使得可以在對象被
回收之前採取行動。
軟引用和弱引用可以單獨使用,但虛引用不能單獨使用,單獨使用虛引用沒有太大的意義,虛引用的主要作用就是
跟蹤對象被記憶體回收的狀態,程式可以通過檢查與虛引用關聯的引用隊列中是否已經包含了該虛引用,從而瞭解虛
引用所引用的對象是否即將被回收。
轉載請註明出處:http://blog.csdn.net/hai_qing_xu_kong/article/details/43890287 情緒控_