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

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