JAVA垃圾回收器學習筆記

 

JAVA垃圾回收器學習——稻草人

(文章學習內容來自課本書籍和互聯網,並在不斷完善中)

 

JAVA的一個重要特點就是具有一個垃圾回收器,能夠實現垃圾的自動回收,而不需要程序員去考慮。Java解釋器在爲一個實例對象分配完存儲空間後,便開始記錄該實例對象所佔用的內存空間的使用,直至使用完畢便將其回收。 在Java的運行過程中,一個垃圾回收器會不定時的被喚醒來檢查是否有不再被使用的對象,並釋放它們佔用的內存空間。垃圾回收器的啓用不由程序員控制,無規律可循。

不同Java虛擬機有不同的垃圾回收機制,一般有兩種比較常用:複製式回收機制和“自省式”回收機制。

1.1.複製式回收機制:

這種策略的執行模式是現將正在運行的程序暫停,然後把正在被使用的所有對象複製一份到另一塊堆內存中,那些 不再被使用的對象所佔的內存空間被釋放。此方式需要的內存空間是所需維護的兩倍,而且當程序只產生了少量甚 至沒有垃圾時,就會導致效率低下。

1.2.“自省式”回收機制:

檢測所有正在使用的對象,併爲他們標註,完成這項工作後再將所有不再被使用的對象所佔據的內存空間一次釋放 掉。儘管此種方式速度很慢,但在只有少量的垃圾或者沒有垃圾時,就極具優勢。

 

這兩種方式頗具互補性,所以在一些JVM中結合的運用。如果程序中的對象長期的使用,JVM就換至“自省式”,而當產生大量垃圾或所佔的內存不連續情況嚴重時,又會換至“複製式”。

 

垃圾收集的目的在於清除不再使用的對象。gc(即是垃圾回收機制)通過確定對象是否被活動對象引用來確定是否收集該對象。gc首先要判斷該對象是否是時候可以收集。兩種常用的方法是引用計數和對象引用遍歷。

2.1.引用計數

引用計數存儲對特定對象的所有引用數,也就是說,當應用程序創建引用以及引用超出範圍時,jvm必須適當增減引用數。當某對象的引用數爲0時,便可以進行垃圾收集。

2.2.對象引用遍歷

早期的jvm使用引用計數,現在大多數jvm採用對象引用遍歷。對象引用遍歷從一組對象開始,沿着整個對象圖上的每條鏈接,遞歸確定可到達(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達,則將它作爲垃圾收集。在對象遍歷階段,gc必須記住哪些對象可以到達,以便刪除不可到達的對象,這稱爲標記(marking)對象。 爲此,gc需要停止其他的活動活動。這種方法意味着所有與應用程序相關的工作停止,只有gc運行。結果,在響應期間增減了許多混雜請求。另外,更復雜的gc不斷增加或同時運行以減少或者清除應用程序的中斷。有的gc使用單線程完成這項工作,有的則採用多線程以增加效率。

 

*另外網上還看到幾種垃圾回收機制,如下:

(1)增量收集器

增量收集器把堆棧分爲多個域,每次僅從一個域收集垃圾。這會造成較小的應用程序中斷。

(2)分代收集器

這種收集器把堆棧分爲兩個或多個域,用以存放不同壽命的對象。jvm生成的新對象一般放在其中的某個域中。過一段時間,繼續存在的對象將獲得使用期並轉入更長壽命的域中。分代收集器對不同的域使用不同的算法以優化性能。

(3)併發收集器

併發收集器與應用程序同時運行。這些收集器在某點上(比如壓縮時)一般都不得不停止其他操作以完成特定的任務,但是因爲其他應用程序可進行其他的後臺操作,所以中斷其他處理的實際時間大大降低。

(4)並行收集器

並行收集器使用某種傳統的算法並使用多線程並行的執行它們的工作。在多cpu機器上使用多線程技術可以顯著的提高java應用程序的可擴展性。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章