張衛(wèi)
摘要:java語言作為一中優(yōu)秀的編程語言,其優(yōu)秀之因素一個(gè)比較重要的方面就是具有自動(dòng)垃圾回收機(jī)制,垃圾回收可以減少程序員的工作量,提升程序的執(zhí)行效率。本文對垃圾回收機(jī)制做了研究說明。
關(guān)鍵詞:GC;垃圾回收機(jī)制;java;jvm;程序
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2017)02-0231-01
Java語言由于其良好的跨平臺(tái)性而得到廣泛應(yīng)用,作為C++的改良語言,java增加了垃圾回收機(jī)制,從而避免了C++運(yùn)行時(shí)由于忘記釋放對象而帶來的內(nèi)存泄漏問題。Java中,運(yùn)行需要的對象名稱存放在棧中,而該對象實(shí)例化后的數(shù)據(jù)保存在堆中,如果一個(gè)棧中的對象不再指向原來堆中的數(shù)據(jù)時(shí),則這個(gè)對象所占用的內(nèi)存空間就是一個(gè)垃圾,Java運(yùn)行環(huán)境中JVM的一個(gè)系統(tǒng)線程能及時(shí)釋放一些無用信息。Java代碼執(zhí)行順序如圖1所示。
從中可知垃圾回收是在一個(gè)程序運(yùn)行塊的最后一個(gè)環(huán)節(jié)(實(shí)際執(zhí)行過程中這個(gè)過程是循環(huán)的,垃圾回收時(shí)間是由算法加權(quán)得到不可預(yù)測)。它是一個(gè)動(dòng)態(tài)存儲(chǔ)管理技術(shù),自動(dòng)釋放不再被引用的對象,這個(gè)釋放的過程按照一定的算法來實(shí)現(xiàn)。在java中沒有c++中的delete命令但是其中系統(tǒng)提供了gc方法回收垃圾。下面對GC機(jī)制下的gc方法進(jìn)行測試:
1 測試代碼
測試代碼如圖2所示。
2 測試環(huán)境
測試環(huán)境是在安裝jdk和jre的電腦上,通過控制臺(tái)調(diào)用javac編譯器編譯生成類文件,然后調(diào)用java命令執(zhí)行該類文件,在后面配置-verbosegc參數(shù)可以查看程序使用堆內(nèi)存的情況,如圖3所示。
3 測試結(jié)果
從測試結(jié)果截圖中可以看到系統(tǒng)共收回848-617=231K的空間,括號(hào)里面的125952K表示堆內(nèi)存總?cè)萘?,共使用?.0105963秒。
上面測試中使用了系統(tǒng)gc方法回收垃圾,但是為了減少使用GC而導(dǎo)致的間歇性停頓,盡量不要顯式調(diào)用系統(tǒng)gc方法。系統(tǒng)GC的觸發(fā)條件是應(yīng)用程序空閑時(shí),或者java堆內(nèi)存不足時(shí),前者是為了不占用系統(tǒng)后期程序運(yùn)行時(shí)間而設(shè)置的優(yōu)化,而后者是強(qiáng)制調(diào)用,出現(xiàn)堆內(nèi)存不足時(shí)系統(tǒng)會(huì)回收內(nèi)存用于重新分配,如果內(nèi)存還是不夠的情況下,系統(tǒng)會(huì)再進(jìn)行兩次GC調(diào)用,如果還是無法滿足條件,就會(huì)報(bào)出內(nèi)存溢出的錯(cuò)誤。
GC在進(jìn)行垃圾回收時(shí),會(huì)首先調(diào)用finalize函數(shù),這個(gè)函數(shù)的作用是釋放一些其他做法開辟的內(nèi)存空間,由于java垃圾回收器默認(rèn)只知道回收由new方法分配的內(nèi)存空間,而一些如調(diào)用c語言malloc函數(shù)分配的空間或者打開的文件資源等,java垃圾回收機(jī)制不會(huì)主動(dòng)收回,這時(shí)候可以在finalize方法中出一些清理工作,需要對該函數(shù)的一個(gè)重寫工作,在重寫的過程中可以對特殊空間進(jìn)行一些處理。
在垃圾回收機(jī)制中,垃圾是要按照一定的算法回收的,通常提供的算法有以下幾種:
(1)增量收集法(Incremental Collecting)。增量收集法是在應(yīng)用運(yùn)行的時(shí)候運(yùn)行算法進(jìn)行垃圾回收,但是在JDK5以后不再使用該算法,此處不敘。
(2)引用計(jì)數(shù)法(Reference Counting)。這是一種比較傳統(tǒng)的垃圾回收算法,在某個(gè)對象被使用的時(shí)候,讓引用計(jì)數(shù)加1,刪除某個(gè)對象的引用后,就讓引用計(jì)數(shù)減1,如此在一個(gè)對象正常引用結(jié)束的時(shí)候,引用計(jì)數(shù)為0,在GC回收內(nèi)存的時(shí)候,只用手機(jī)引用計(jì)數(shù)為0的對象。但是這個(gè)算法無法解決對象的循環(huán)引用。
4 結(jié)語
垃圾回收機(jī)制給程序員的開發(fā)帶來了極大的便利,垃圾回收能自動(dòng)釋放內(nèi)存空間,減輕編程的負(fù)擔(dān)。這使Java 虛擬機(jī)具有一些優(yōu)點(diǎn)。首先在編程效率方面,垃圾回收機(jī)制幫助程序員解決了很多難懂的存儲(chǔ)器問題,同時(shí)垃圾回收機(jī)制提升程序的安全性,保護(hù)程序的完整。