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

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