用過C++編程的人知道,編的時(shí)候總是要跟蹤所創(chuàng)建的對象,并且需要顯示地刪除不用的對象。這種方式太麻煩了,容易出錯(cuò)。寫了那么多代碼,能記住嗎,要是把有用的給刪了怎么辦,要是有沒用的忘刪了怎么辦?這些問題是很嚴(yán)重的。在java語言中采用的垃圾收集器這種方式管理內(nèi)存,就很方便也很安全了。垃圾收集器,可以自動(dòng)確定哪個(gè)對象不再被利用,它可以自動(dòng)將它刪除。這也是java語言的一大優(yōu)勢。
我們要想顯示的刪除一個(gè)對象的引用也很簡單,將該引用的變量賦值為null不就行了嗎?對于垃圾收集器來說,當(dāng)程序員創(chuàng)建對象時(shí),垃圾收集器就開始監(jiān)控這個(gè)對象的地址、大小以及使用情況。通常,垃圾收集器采用有向圖的方式記錄和管理堆(heap)中的所有對 象。通過這種方式確定哪些對象是“可用的”,哪些對象是“不可用的”。當(dāng)垃圾收集器確定一些對象為“不可用”時(shí),垃圾收集器就回收這些內(nèi)存空間。
可是垃圾收集器卻以較低的優(yōu)先級在系統(tǒng)空閑周期中執(zhí)行,通俗一點(diǎn)說就是它級別低,別人不運(yùn)行時(shí)候才輪到它,因此垃圾收集器的速度比較慢。有些時(shí)候我們會(huì)使用System.gc()。手動(dòng)回收。這樣來提高性能。
對于垃圾收集器來說還有一個(gè)值得一提的是finalize()這個(gè)方法,每一個(gè)對象都有一個(gè)finalize( )方法,這個(gè)方法是從Object類繼承來的。它用來回收內(nèi)存以外的系統(tǒng)資源,就像是文件處理器和網(wǎng)絡(luò)連接器。該方法的調(diào)用順序和用來調(diào)用該方法的對象的創(chuàng)建順序是無關(guān)的。換句話說,書寫程序時(shí)該方法的順序和方法的實(shí)際調(diào)用順序是不相干的。這只是finalize( )方法的特點(diǎn)。還有,每個(gè)對象只能調(diào)用finalize( )方法一次。如果在finalize( )方法執(zhí)行時(shí)產(chǎn)生異常(exception),則該對象仍可以被垃圾收集器收集。那是一定了,不能說用到finalize()了。垃圾收集器就什么也不做了啊。finalize()的工作量是很大的哦
總結(jié):
Java用了垃圾收集器的內(nèi)存管理方式,并不是說它完全的好。有的時(shí)候會(huì)影響它的性能,我們還是要手動(dòng)來收集的。但是要是像C++那樣完全手動(dòng)來收集的話,那也實(shí)在是太麻煩了而且不是很安全。
根據(jù)垃圾收集器的工作原理,我們可以通過一些技巧和方式,讓垃圾收集器運(yùn)行更加有效率。
1.最基本的建議就是盡早釋放無用對象的引用。
大多數(shù)程序員在使用臨時(shí)變量的時(shí)候,都是讓引用變量在退出活動(dòng)域(scope)后,自動(dòng)設(shè)置為null.
2.盡量少用finalize函數(shù)。finalize函數(shù)是Java提供給程序員一個(gè)釋放對象或資源的機(jī)會(huì)。但是,它會(huì)加大垃圾收集器的工作量,因此盡量少采用finalize方式回收資源。
3.當(dāng)程序有一定的等待時(shí)間,程序員可以手動(dòng)執(zhí)行System.gc(),通知垃圾收集器運(yùn)行,但是Java語言規(guī)范并不保證垃圾收集器一定會(huì)執(zhí)行。
我們要想顯示的刪除一個(gè)對象的引用也很簡單,將該引用的變量賦值為null不就行了嗎?對于垃圾收集器來說,當(dāng)程序員創(chuàng)建對象時(shí),垃圾收集器就開始監(jiān)控這個(gè)對象的地址、大小以及使用情況。通常,垃圾收集器采用有向圖的方式記錄和管理堆(heap)中的所有對 象。通過這種方式確定哪些對象是“可用的”,哪些對象是“不可用的”。當(dāng)垃圾收集器確定一些對象為“不可用”時(shí),垃圾收集器就回收這些內(nèi)存空間。
可是垃圾收集器卻以較低的優(yōu)先級在系統(tǒng)空閑周期中執(zhí)行,通俗一點(diǎn)說就是它級別低,別人不運(yùn)行時(shí)候才輪到它,因此垃圾收集器的速度比較慢。有些時(shí)候我們會(huì)使用System.gc()。手動(dòng)回收。這樣來提高性能。
對于垃圾收集器來說還有一個(gè)值得一提的是finalize()這個(gè)方法,每一個(gè)對象都有一個(gè)finalize( )方法,這個(gè)方法是從Object類繼承來的。它用來回收內(nèi)存以外的系統(tǒng)資源,就像是文件處理器和網(wǎng)絡(luò)連接器。該方法的調(diào)用順序和用來調(diào)用該方法的對象的創(chuàng)建順序是無關(guān)的。換句話說,書寫程序時(shí)該方法的順序和方法的實(shí)際調(diào)用順序是不相干的。這只是finalize( )方法的特點(diǎn)。還有,每個(gè)對象只能調(diào)用finalize( )方法一次。如果在finalize( )方法執(zhí)行時(shí)產(chǎn)生異常(exception),則該對象仍可以被垃圾收集器收集。那是一定了,不能說用到finalize()了。垃圾收集器就什么也不做了啊。finalize()的工作量是很大的哦
總結(jié):
Java用了垃圾收集器的內(nèi)存管理方式,并不是說它完全的好。有的時(shí)候會(huì)影響它的性能,我們還是要手動(dòng)來收集的。但是要是像C++那樣完全手動(dòng)來收集的話,那也實(shí)在是太麻煩了而且不是很安全。
根據(jù)垃圾收集器的工作原理,我們可以通過一些技巧和方式,讓垃圾收集器運(yùn)行更加有效率。
1.最基本的建議就是盡早釋放無用對象的引用。
大多數(shù)程序員在使用臨時(shí)變量的時(shí)候,都是讓引用變量在退出活動(dòng)域(scope)后,自動(dòng)設(shè)置為null.
2.盡量少用finalize函數(shù)。finalize函數(shù)是Java提供給程序員一個(gè)釋放對象或資源的機(jī)會(huì)。但是,它會(huì)加大垃圾收集器的工作量,因此盡量少采用finalize方式回收資源。
3.當(dāng)程序有一定的等待時(shí)間,程序員可以手動(dòng)執(zhí)行System.gc(),通知垃圾收集器運(yùn)行,但是Java語言規(guī)范并不保證垃圾收集器一定會(huì)執(zhí)行。