Java垃圾回收新算法
(1)程序開始運行,對象動態(tài)地申請堆區(qū),這時,每個塊的計數(shù)器啟動,根據(jù)引用對象的標記位情況來改變計數(shù)器的值,為1則計數(shù)器加1,8個計數(shù)器值放在數(shù)組里,并比較8個計數(shù)器值的大小,選取最大的計數(shù)器所在塊,進行掃描。
(2)掃描出的垃圾轉(zhuǎn)移到刪除區(qū),等待被刪除。
(3)繼續(xù)比較計數(shù)器值,但已經(jīng)進行掃描的塊不參加此后的比較,待刪除的垃圾占的空間達到min值時,垃圾器開始對活躍區(qū)壓縮內(nèi)存碎片,并且在刪除區(qū)同時開始進行垃圾刪除申請。
(4)當刪除區(qū)的空間達到了max值時,刪除區(qū)的垃圾還沒有被刪除,這時停止活躍區(qū)的掃描,等待刪除區(qū)進行垃圾刪除。
4.2 實例分析
看下面一段程序:
int [][] m1=new int[2][3];
int [][] m2=new int[2][3];
m1=m2;
此例中,第一句是用new語句在堆中為數(shù)組申請了一個空間,然后用matrix引用此空間的對象(這里數(shù)組可以理解為對象),此時這個內(nèi)存空間就是有用的。第二句是給matrix賦空值,matrix則不再引用此數(shù)組。此時,這個空間就是無用的。
對于原來的算法,m1引用的數(shù)組在堆中是隨機存放的,若要查找垃圾,則會遍歷整個堆內(nèi)存,先標記,然后再清理垃圾。設耗費時間為Ta。
m1引用的數(shù)組在堆中是隨機存放的,所以假設其放在活躍區(qū)中的cnt[x]區(qū)(x取值為0~7之一),下面分兩種情況來考慮:
(1)最好的情況,m1原來引用的數(shù)組放在cnt1中為數(shù)組cnt[x]中最大的數(shù),則查找到這個垃圾的時間為: T8+cnt[x]。

由此可以節(jié)省7Ta/16的時間。此新算法可以大大減少垃圾處理所需的時間。
Java語言對垃圾的處理是利用Java的垃圾處理器自動進行的,JVM雖然沒有明確程序員必須了解垃圾處理器的過程和實質(zhì),但是,一個優(yōu)秀的Java程序員應該掌握和熟悉垃圾處理器的工作機制,充分利用好內(nèi)存空間,減少不必要的空間浪費,從而使程序更好地運行。
評論