專利名稱:一種Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及垃圾回收方法及監(jiān)測系統(tǒng)技術(shù)領(lǐng)域,主要適用于Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng)。
背景技術(shù):
目前Java虛擬機(jī)中的垃圾回收方法有兩種第一是引用計(jì)數(shù)法;第二是跟蹤回收法。對于引用計(jì)數(shù)法,是通過計(jì)算對象的被引用次數(shù)來判斷該對象是否達(dá)到了回收的標(biāo)準(zhǔn)。該方法的弊端有1.不適用于循環(huán)引用的情況。若對象C只被對象D引用,而對象D只被對象C引用,則對象C和對象D的被引用次數(shù)均為I。按照此方法的回收標(biāo)準(zhǔn)來說,對 象C和對象D都不符合垃圾回收的標(biāo)準(zhǔn),但Java虛擬機(jī)無法訪問到對象C和對象D,對象C和對象D都需要被回收。2.對被引用計(jì)數(shù)的維護(hù)開銷較大。需要對每個(gè)對象的被引用次數(shù)進(jìn)行計(jì)數(shù)并進(jìn)行加減運(yùn)算。對于跟蹤回收法,是通過遍歷判斷哪些對象可達(dá),哪些對象不可達(dá)來確定回收的對象。跟蹤回收法的弊端為效率較低,導(dǎo)致當(dāng)前執(zhí)行程序暫停時(shí)間較長。在進(jìn)行垃圾回收時(shí),當(dāng)前執(zhí)行的程序需暫停執(zhí)行。每次都需要遍歷根集下的所有對象,會導(dǎo)致Java虛擬機(jī)中當(dāng)前運(yùn)行的程序暫停時(shí)間較長。若要提高當(dāng)前程序的運(yùn)行效率,有兩種方法一、當(dāng)垃圾回收線程在運(yùn)行時(shí),當(dāng)前運(yùn)行程序照常執(zhí)行(CPU為單核時(shí)并發(fā)執(zhí)行,CPU為多核時(shí)并行執(zhí)行)。但是這種方法使得當(dāng)垃圾回收線程在運(yùn)行時(shí),當(dāng)前運(yùn)行程序會產(chǎn)生新的對象及垃圾對象,從而導(dǎo)致垃圾回收線程變得異常復(fù)雜。因?yàn)楫?dāng)當(dāng)前運(yùn)行程序產(chǎn)生新的對象或垃圾對象時(shí),都會導(dǎo)致垃圾回收線程之前的工作成果變得無效而需要從頭開始運(yùn)行。二、可以多線程執(zhí)行垃圾回收,這樣便縮短了垃圾回收的執(zhí)行時(shí)間,從而將當(dāng)前執(zhí)行程序的暫停時(shí)間縮短。但此種方法有一個(gè)問題需解決,那就是多線程間的信息共享,如哪些對象可達(dá),哪些對象不可達(dá),Java虛擬機(jī)中有哪些對象等等。這樣又將導(dǎo)致垃圾回收算法復(fù)雜度加大。Java虛擬機(jī)是由軟件虛擬出來的運(yùn)行在實(shí)體計(jì)算機(jī)上的“機(jī)器”,而Java程序就運(yùn)行在Java虛擬機(jī)上。運(yùn)用引用計(jì)數(shù)法或跟蹤回收法進(jìn)行垃圾回收時(shí),會有部分垃圾數(shù)據(jù)無法被回收或回收不及時(shí),從而會導(dǎo)致Java虛擬機(jī)的內(nèi)存空間被大量占用。而Java虛擬機(jī)又是運(yùn)行在實(shí)體計(jì)算機(jī)上的,其內(nèi)存為實(shí)體機(jī)內(nèi)存的一部分,故無法被回收或回收不及時(shí)的垃圾數(shù)據(jù)會占用實(shí)體機(jī)的內(nèi)存空間。若實(shí)體機(jī)的內(nèi)存空間較小,則未被回收或回收不及時(shí)的垃圾數(shù)據(jù)會導(dǎo)致實(shí)體機(jī)的內(nèi)存不夠用,從而會降低實(shí)體機(jī)的運(yùn)行效率。另外,由于Java應(yīng)用程序在生產(chǎn)環(huán)境中與開發(fā)、測試環(huán)境不一致,常常導(dǎo)致Java應(yīng)用程序在開發(fā)或測試環(huán)境中不會出現(xiàn)的問題在生產(chǎn)環(huán)境中出現(xiàn),如內(nèi)存泄漏、死循環(huán)導(dǎo)致的內(nèi)存溢出錯(cuò)誤。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng),它一方面可以對循環(huán)引用中的Java程序中的垃圾數(shù)據(jù)進(jìn)行高效回收,從而保證了 Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率;另一方面可以對Java虛擬機(jī)中的垃圾回收情況進(jìn)行監(jiān)控,能夠了解到Java虛擬機(jī)中的垃圾回收線程的運(yùn)行情況及Java虛擬機(jī)的內(nèi)存情況,以便能更直接、更準(zhǔn)確地解決Java虛擬機(jī)中所存在的問題,從而提高Java虛擬機(jī)的運(yùn)行效率,進(jìn)而保證Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率。為解決上述技術(shù)問題,本發(fā)明提供了一種Java虛擬機(jī)的垃圾回收方法包括先判斷Java虛擬機(jī)的根集是否為空;若所述根集為空,則所有對象達(dá)到了回收標(biāo)準(zhǔn);否則對對象A進(jìn)行判斷;具體方法為先判斷以所述對象A為鏈表頭的引用鏈表下是否有對象;
若所述引用鏈表下無對象,則說明對象A達(dá)到了回收標(biāo)準(zhǔn);若引用鏈表下有對象B,則通過所述對象B來判斷對象A是否能夠被根集中的對象引用;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。進(jìn)一步地,所述通過對象B來判斷對象A是否能夠被根集中的對象引用包括先判斷對象B是否存在于根集中;若所述對象B在根集中,則說明對象B沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷對象B是否存在于鏈表頭中,若對象B不在鏈表頭中,則說明對象B沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷;若對象B在鏈表頭中,則以對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。進(jìn)一步地,在所述以對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表之前,先判斷對象B是否為回路對象;若所述對象B是回路對象,則說明對象B所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷;若對象B不是回路對象,則以所述對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表。進(jìn)一步地,在所述繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷包括先判斷所述的下一個(gè)C對象是否為空;若下一個(gè)對象C為空,即下一個(gè)對象C不存在,則說明對以對象A為鏈表頭的引用鏈表遍歷完畢,而對象A不能被根集中的對象引用,故對象A達(dá)到了回收標(biāo)準(zhǔn);若下一個(gè)對象C不為空,則先判斷下一個(gè)對象C是否存在于根集中;若下一個(gè)對象C在根集中,則說明下一個(gè)對象C沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷下一個(gè)對象C是否存在于鏈表頭中,若下一個(gè)對象C不在鏈表頭中,則說明下一個(gè)對象C沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C在鏈表頭中,先判斷下一個(gè)對象C是否為回路對象;若下一個(gè)對象C是回路對象,則說明下一個(gè)對象C所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C不是回路對象,則以對象A為回路對象遞歸遍歷以下一個(gè)對象C為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。本發(fā)明還提供了一種Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng)包括輸入設(shè)備、控制器、存儲器及通訊組件;所述輸入設(shè)備和所述存儲器各自分別與所述控制器連接;控制器通過所述通訊組件與Java虛擬機(jī)連接。進(jìn)一步地,還包括運(yùn)算器;所述運(yùn)算器分別與所述存儲器、所述控制器連接。進(jìn)一步地,還包括顯示設(shè)備;所述顯 示設(shè)備與所述控制器連接。本發(fā)明的有益效果在于本發(fā)明的提供Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng)在一方面可以對循環(huán)引用中的Java程序中的垃圾數(shù)據(jù)進(jìn)行高效回收,從而保證了 Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率;另一方面可以對Java虛擬機(jī)中的垃圾回收情況進(jìn)行監(jiān)控,能夠了解到Java虛擬機(jī)中的垃圾回收線程的運(yùn)行情況及Java虛擬機(jī)的內(nèi)存情況,以便能更直接、更準(zhǔn)確地解決Java虛擬機(jī)中所存在的問題,從而提高Java虛擬機(jī)的運(yùn)行效率,進(jìn)而保證Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率。本發(fā)明結(jié)構(gòu)合理、效果顯著、實(shí)用性強(qiáng)。
圖I為本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的流程圖。圖2為本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng)的結(jié)構(gòu)框圖。
具體實(shí)施例方式為進(jìn)一步闡述本發(fā)明為達(dá)成預(yù)定發(fā)明目的所采取的技術(shù)手段及功效,以下結(jié)合附圖及較佳實(shí)施例,對依據(jù)本發(fā)明提出的Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng)的具體實(shí)施方式
及工作原理進(jìn)行詳細(xì)說明。由圖I可知,本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法包括先判斷Java虛擬機(jī)的根集是否為空;若根集為空,則所有對象達(dá)到了回收標(biāo)準(zhǔn);否則對Java虛擬機(jī)中的對象A進(jìn)行判斷;具體方法為先判斷以對象A為鏈表頭的引用鏈表下是否有對象,即對象A對應(yīng)的引用鏈表是否為空;若引用鏈表下無對象,則說明對象A達(dá)到了回收標(biāo)準(zhǔn);若引用鏈表下有對象B,則通過對象B來判斷對象A是否能夠被根集中的對象引用;具體方法為先判斷對象B是否存在于根集中;若對象B在根集中,則說明對象B沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);若對象B不在根集中,再判斷對象B是否存在于鏈表頭中;若對象B不在鏈表頭中,則說明對象B沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷;具體的,先判斷的下一個(gè)C對象是否為空;若下一個(gè)對象C為空,即下一個(gè)對象C不存在,則說明對以對象A為鏈表頭的引用鏈表遍歷完畢,而對象A不能被根集中的對象引用,故對象A達(dá)到了回收標(biāo)準(zhǔn);若下一個(gè)對象C不為空,則先判斷下一個(gè)對象C是否存在于根集中;若下一個(gè)對象C在根集中,則說明下一個(gè)對象C沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷下一個(gè)對象C是否存在于鏈表頭中,若下一個(gè)對象C不在鏈表頭中,則說明下一個(gè)對象C沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C在鏈表頭中,先判斷下一個(gè)對象C是否為回路對象;若下一個(gè)對象C是回路對象,則說明下一個(gè)對象C所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C不是回路對象,則以對象A為回路對象遞歸遍歷以下一個(gè)對象C為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。若對象B在鏈表頭中,先判斷對象B是否為回路對象;若對象B是回路對象,則說明對象B所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷;具體的,先判斷的下一個(gè)C對象是否為空;若下一個(gè)對象C為空,即下一個(gè)對象C不存在,則說明對以對象A為鏈表頭的引用鏈表遍歷完畢,而對象A不能被根集中的對象引·用,故對象A達(dá)到了回收標(biāo)準(zhǔn);若下一個(gè)對象C不為空,則先判斷下一個(gè)對象C是否存在于根集中;若下一個(gè)對象C在根集中,則說明下一個(gè)對象C沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷下一個(gè)對象C是否存在于鏈表頭中,若下一個(gè)對象C不在鏈表頭中,則說明下一個(gè)對象C沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C在鏈表頭中,先判斷下一個(gè)對象C是否為回路對象;若下一個(gè)對象C是回路對象,則說明下一個(gè)對象C所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C不是回路對象,則以對象A為回路對象遞歸遍歷以下一個(gè)對象C為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。若對象B不是回路對象,則以對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng),包括輸入設(shè)備、控制器、運(yùn)算器、存儲器、顯示設(shè)備及通訊組件;輸入設(shè)備、運(yùn)算器、顯示設(shè)備及存儲器各自分別與控制器連接;運(yùn)算器還與存儲器連接;控制器通過通訊組件與目標(biāo)Java虛擬機(jī)連接。具體的,由圖2可知,輸入設(shè)備通過I/O接口電路與數(shù)據(jù)總線連接,以輸入數(shù)據(jù);通過I/o接口電路與控制總線相連,以接受控制器的控制信號。顯示設(shè)備通過I/O接口電路與數(shù)據(jù)總線連接,以輸出數(shù)據(jù);通過I/O接口電路與控制總線相連,以接受控制器的控制信號。運(yùn)算器直接與數(shù)據(jù)總線相連,既可接受數(shù)據(jù),又可輸出數(shù)據(jù);又與地址總線相連,以通過地址總線找到地址對應(yīng)的數(shù)據(jù)??刂破髋c數(shù)據(jù)總線、地址總線及控制總線相連。從數(shù)據(jù)總線可以接受數(shù)據(jù);從地址總線可以找到地址對應(yīng)數(shù)據(jù);從控制總線可以發(fā)出控制信號到其他部件。存儲器與數(shù)據(jù)總線、地址總線及控制總線相連。從數(shù)據(jù)總線既可以輸入數(shù)據(jù),也可以輸出數(shù)據(jù);從地址總線,可以接受按地址查詢數(shù)據(jù)的請求;從控制總線可以接受控制信號。通訊組件與數(shù)據(jù)總線、控制總線相連。從數(shù)據(jù)總線可得到數(shù)據(jù),也可以輸出數(shù)據(jù)到數(shù)據(jù)總線;從控制總線可以接受發(fā)出通訊的控制信號。通過本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法對Java虛擬機(jī)中的垃圾進(jìn)行回收,首先判斷Java虛擬機(jī)的根集是否為空;若根集為空,則所有對象達(dá)到了回收標(biāo)準(zhǔn);否則對Java虛擬機(jī)中的對象A進(jìn)行判斷;具體方法為先判斷以對象A為鏈表頭的引用鏈表下是否有對象;若引用鏈表下無對象,則說明對象A達(dá)到了回收標(biāo)準(zhǔn);若引用鏈表下有對象B,則通過對象B來判斷對象A是否能夠被根集中的對象引用;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。通過此方法,可以判斷Java虛擬機(jī)中的其他對象是否達(dá)到回收標(biāo)準(zhǔn)。
通過本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng)可以對Java虛擬機(jī)的垃圾回收情況進(jìn)行監(jiān)控,以查詢Java虛擬機(jī)中的根集為例。首先用戶通過輸入設(shè)備輸入要查詢目標(biāo)Java虛擬機(jī)中根集的指令;查詢指令到達(dá)控制器后,控制器對接收到的指令進(jìn)行解析。再通過通訊組件將查詢指令發(fā)送到目標(biāo)Java虛擬機(jī),再得到由目標(biāo)Java虛擬機(jī)返回的數(shù)據(jù)??刂破髟偻ㄟ^顯示設(shè)備將目標(biāo)Java虛擬機(jī)的根集情況顯示出來。需要說明的是,若由目標(biāo)Java虛擬機(jī)返回的數(shù)據(jù)需要做進(jìn)一步處理時(shí),控制器先將返回的數(shù)據(jù)放置在存儲器中,再命令運(yùn)算器對存儲器中的數(shù)據(jù)進(jìn)行運(yùn)算,從而得出結(jié)果數(shù)據(jù),再將得到的結(jié)果數(shù)據(jù)返回到控制器,并通過顯示設(shè)備顯示出來。通過本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的監(jiān)控系統(tǒng)可以遠(yuǎn)程監(jiān)控Java虛擬機(jī)中存在的根集、所有對象、所有對象的引用鏈表,由此可知哪些對象是應(yīng)該回收但沒有回收的,從而優(yōu)化程序代碼,進(jìn)而避免了內(nèi)存泄漏的情況;另外,若Java虛擬機(jī)發(fā)生內(nèi)存溢出錯(cuò)誤,可以通過返回的數(shù)據(jù)信息發(fā)現(xiàn)是哪段程序代碼出現(xiàn)了問題,再修改漏洞,從而提高了 Java虛擬機(jī)的運(yùn)行效率,進(jìn)而能夠保證Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率。本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法一方面不考慮Java虛擬機(jī)中的死循環(huán)回路的情況,再通過對Java虛擬機(jī)中的對象的引用鏈表進(jìn)行遞歸遍歷來判斷Java虛擬機(jī)中的對象是否能被根集中的對象引用,從而得出Java虛擬機(jī)中的對象是否達(dá)到回收標(biāo)準(zhǔn)的結(jié)論,實(shí)現(xiàn)了對循環(huán)引用中的垃圾數(shù)據(jù)的回收;另一方面,本發(fā)明通過先判斷對象的引用鏈表是否為空,可處理大部分情況,而后再對循環(huán)引用及長引用的情況進(jìn)行處理,這樣不需要每次對所有對象進(jìn)行遍歷,從而提高了 Java虛擬機(jī)中垃圾回收的效率,從而提高了 Java虛擬機(jī)的運(yùn)行效率,進(jìn)而保證了 Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率。本發(fā)明提供的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng)可以對Java虛擬機(jī)中的垃圾回收情況進(jìn)行監(jiān)控,能夠了解到Java虛擬機(jī)中的垃圾回收線程的運(yùn)行情況及Java虛擬機(jī)的內(nèi)存情況,以便能更直接、更準(zhǔn)確地解決Java虛擬機(jī)中所存在的問題,從而提高Java虛擬機(jī)的運(yùn)行效率,進(jìn)而保證了 Java虛擬機(jī)所在的實(shí)體計(jì)算機(jī)的運(yùn)行效率。本發(fā)明結(jié)構(gòu)合理、效果顯著、實(shí)用性強(qiáng)。最后所應(yīng)說明的是,以上具體實(shí)施方式
僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照實(shí)例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種Java虛擬機(jī)的垃圾回收方法,其特征在于,包括 先判斷Java虛擬機(jī)的根集是否為空; 若所述根集為空,則所有對象達(dá)到了回收標(biāo)準(zhǔn);否則對對象A進(jìn)行判斷;具體方法為 先判斷以所述對象A為鏈表頭的引用鏈表下是否有對象; 若所述引用鏈表下無對象,則說明對象A達(dá)到了回收標(biāo)準(zhǔn); 若引用鏈表下有對象B,則通過所述對象B來判斷對象A是否能夠被根集中的對象引用; 若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn); 若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。
2.如權(quán)利要求I所述的Java虛擬機(jī)的垃圾回收方法,其特征在于,所述通過對象B來判斷對象A是否能夠被根集中的對象引用包括先判斷對象B是否存在于根集中;若所述對象B在根集中,則說明對象B沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷對象B是否存在于鏈表頭中,若對象B不在鏈表頭中,則說明對象B沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷;若對象B在鏈表頭中,則以對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。
3.如權(quán)利要求2所述的Java虛擬機(jī)的垃圾回收方法,其特征在于,在所述以對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表之前,先判斷對象B是否為回路對象; 若所述對象B是回路對象,則說明對象B所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷; 若對象B不是回路對象,則以所述對象A為回路對象遞歸遍歷以對象B為鏈表頭的引用鏈表。
4.如權(quán)利要求3所述的Java虛擬機(jī)的垃圾回收方法,其特征在于,在所述繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷包括先判斷所述的下一個(gè)C對象是否為空; 若下一個(gè)對象C為空,即下一個(gè)對象C不存在,則說明對以對象A為鏈表頭的引用鏈表遍歷完畢,而對象A不能被根集中的對象引用,故對象A達(dá)到了回收標(biāo)準(zhǔn); 若下一個(gè)對象C不為空,則先判斷下一個(gè)對象C是否存在于根集中;若下一個(gè)對象C在根集中,則說明下一個(gè)對象C沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷下一個(gè)對象C是否存在于鏈表頭中,若下一個(gè)對象C不在鏈表頭中,則說明下一個(gè)對象C沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C在鏈表頭中,先判斷下一個(gè)對象C是否為回路對象;若下一個(gè)對象C是回路對象,則說明下一個(gè)對象C所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C不是回路對象,則以對象A為回路對象遞歸遍歷以下一個(gè)對象C為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。
5.如權(quán)利要求3所述的Java虛擬機(jī)的垃圾回收方法,其特征在于,在所述繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象C進(jìn)行判斷包括先判斷所述的下一個(gè)C對象是否為空;若下一個(gè)對象C為空,即下一個(gè)對象C不存在,則說明對以對象A為鏈表頭的引用鏈表遍歷完畢,而對象A不能被根集中的對象引用,故對象A達(dá)到了回收標(biāo)準(zhǔn);若下一個(gè)對象C不為空,則先判斷下一個(gè)對象C是否存在于根集中;若下一個(gè)對象C在根集中,則說明下一個(gè)對象C沒有達(dá)到回收標(biāo)準(zhǔn),故對象A也沒有達(dá)到回收標(biāo)準(zhǔn);否則接著判斷下一個(gè)對象C是否存在于鏈表頭中,若下一個(gè)對象C不在鏈表頭中,則說明下一個(gè)對象 C沒有被任何對象引用;并繼續(xù)對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C在鏈表頭中,先判斷下一個(gè)對象C是否為回路對象;若下一個(gè)對象C是回路對象,則說明下一個(gè)對象C所在的引用回路為死循環(huán),再對以鏈表頭為對象A的引用鏈表中的下一個(gè)對象D進(jìn)行判斷;若下一個(gè)對象C不是回路對象,則以對象A為回路對象遞歸遍歷以下一個(gè)對象C為鏈表頭的引用鏈表;若對象A能被根集中的對象引用,則說明對象 A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。
6.一種基于如權(quán)利要求1-5中任意一項(xiàng)所述的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng),其特征在于,包括輸入設(shè)備、控制器、存儲器及通訊組件;所述輸入設(shè)備和所述存儲器各自分別與所述控制器連接;控制器通過所述通訊組件與Java虛擬機(jī)連接。
7.如權(quán)利要求6所述的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng),其特征在于,還包括 運(yùn)算器;所述運(yùn)算器分別與所述存儲器、所述控制器連接。
8.如權(quán)利要求6所述的Java虛擬機(jī)的垃圾回收方法的監(jiān)測系統(tǒng),其特征在于,還包括 顯示設(shè)備;所述顯示設(shè)備與所述控制器連接。
全文摘要
本發(fā)明涉及垃圾回收方法及監(jiān)測系統(tǒng)技術(shù)領(lǐng)域,公開了一種Java虛擬機(jī)的垃圾回收方法及其監(jiān)測系統(tǒng)。該方法包括先判斷Java虛擬機(jī)的根集是否為空;若根集為空,則所有對象達(dá)到了回收標(biāo)準(zhǔn);否則對對象A進(jìn)行判斷;具體方法為先判斷以對象A為鏈表頭的引用鏈表下是否有對象;若引用鏈表下無對象,則說明對象A達(dá)到了回收標(biāo)準(zhǔn);若引用鏈表下有對象B,則通過對象B來判斷對象A是否能夠被根集中的對象引用;若對象A能被根集中的對象引用,則說明對象A沒有達(dá)到回收標(biāo)準(zhǔn);若對象A不能被根集中的對象引用,則說明對象A達(dá)到了回收標(biāo)準(zhǔn)。本發(fā)明可以對循環(huán)引用中的Java程序中的垃圾數(shù)據(jù)進(jìn)行高效回收。
文檔編號G06F9/46GK102929699SQ20121038466
公開日2013年2月13日 申請日期2012年10月10日 優(yōu)先權(quán)日2012年10月10日
發(fā)明者田新華 申請人:武漢鋼鐵(集團(tuán))公司