垃圾收集器線(xiàn)程是一種低優(yōu)先級的線(xiàn)程,在一個(gè)Java 程序的生命周期中,它只有在內存空
閑的時(shí)候才有機會(huì )運行。它有效地防止了內存滲漏體的出現,并極大可能地節省了寶貴的
內存資源。但是,通過(guò)Java 虛擬機來(lái)執行垃圾收集器的方案可以是多種多樣的。
垃圾收集器的主要特點(diǎn)有:
1.垃圾收集器的工作目標是回收已經(jīng)無(wú)用的對象的內存空間,從而避免內存滲漏體的產(chǎn)
生,節省內存資源,避免程序代碼的崩潰。
2.垃圾收集器判斷一個(gè)對象的內存空間是否無(wú)用的標準是:如果該對象不能再被程序中任
何一個(gè)"活動(dòng)的部分"所引用,此時(shí)我們就說(shuō),該對象的內存空間已經(jīng)無(wú)用。所謂"活動(dòng)的部
分",是指程序中某部分參與程序的調用,正在執行過(guò)程中,尚未執行完畢。
3.垃圾收集器線(xiàn)程雖然是作為低優(yōu)先級的線(xiàn)程運行,但在系統可用內存量過(guò)低的時(shí)候,它
可能會(huì )突發(fā)地執行來(lái)挽救內存資源。當然其執行與否也是不可預知的。
4.垃圾收集器不可以被強制執行,但程序員可以通過(guò)調用System. gc 方法來(lái)建議執行垃
圾收集器。
5.不能保證一個(gè)無(wú)用的對象一定會(huì )被垃圾收集器收集,也不能保證垃圾收集器在一段
Java 語(yǔ)言代碼中一定會(huì )執行。因此在程序執行過(guò)程中被分配出去的內存空間可能會(huì )一直保
留到該程序執行完畢,除非該空間被重新分配或被其他方法回收。由此可見(jiàn),完全徹底地
根絕內存滲漏體的產(chǎn)生也是不可能的。但是請不要忘記,Java 的垃圾收集器畢竟使程序員
從手工回收內存空間的繁重工作中解脫了出來(lái)。設想一個(gè)程序員要用C 或C++來(lái)編寫(xiě)一段
10 萬(wàn)行語(yǔ)句的代碼,那么他一定會(huì )充分體會(huì )到Java 的垃圾收集器的優(yōu)點(diǎn)!
6.同樣沒(méi)有辦法預知在一組均符合垃圾收集器收集標準的對象中,哪一個(gè)會(huì )被首先收集。
7.循環(huán)引用對象不會(huì )影響其被垃圾收集器收集。
8.可以通過(guò)將對象的引用變量(reference variables,即句柄handles)初始化為null
值,來(lái)暗示垃圾收集器來(lái)收集該對象。但此時(shí),如果該對象連接有事件監聽(tīng)器(典型的
AWT 組件),那它還是不可以被收集。所以在設一個(gè)引用變量為null 值之前,應注意該引
用變量指向的對象是否被監聽(tīng),若有,要首先除去監聽(tīng)器,然后才可以賦空值。
9.每一個(gè)對象都有一個(gè)finalize( )方法,這個(gè)方法是從Object 類(lèi)繼承來(lái)的。
10.finalize( )方法用來(lái)回收內存以外的系統資源,就像是文件處理器和網(wǎng)絡(luò )連接器。該
方法的調用順序和用來(lái)調用該方法的對象的創(chuàng )建順序是無(wú)關(guān)的。換句話(huà)說(shuō),書(shū)寫(xiě)程序時(shí)該
方法的順序和方法的實(shí)際調用順序是不相干的。請注意這只是finalize( )方法的特點(diǎn)。
11.每個(gè)對象只能調用finalize( )方法一次。如果在finalize( )方法執行時(shí)產(chǎn)生異常
(exception),則該對象仍可以被垃圾收集器收集。
12.垃圾收集器跟蹤每一個(gè)對象,收集那些不可到達的對象(即該對象沒(méi)有被程序的任何"
活的部分"所調用),回收其占有的內存空間。但在進(jìn)行垃圾收集的時(shí)候,垃圾收集器會(huì )調
用finalize( )方法,通過(guò)讓其他對象知道它的存在,而使不可到達的對象再次"復蘇"為
可到達的對象。既然每個(gè)對象只能調用一次finalize( )方法,所以每個(gè)對象也只可能"復
蘇"一次。(節選,具體地址參見(jiàn)http://www.ibwen.com/show/2460.html)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。