總結Java垃圾回收器的方法和原理


1. 垃圾回收只與內存有關

在Java中,我們new完對象之后,垃圾回收器負責回收無用的對象占據的內存資源。這與C++不同,在C++中,准許使用局部對象,回收對象時候,需要用到finalize()析構函數。C++的對象創建在堆棧中,而Java對象創建在堆中,所以我們創建完對象之后,Java的垃圾回收器在堆中,會自動幫我們回收垃圾,至於何時回收垃圾,我們不得而知了。

2.垃圾回收用到的方法

(1)finalize()

該方法是用來回收“特殊”的內存,而這內存不是new出來的,所以垃圾回收器無法回收。這種情況主要發生在使用“本地方法”的情況下,本地方法是一種在Java中使用的非Java代碼,可以調用任何代碼,但只能被C和C++調用。所以我們使用finalize()來釋放本地方法產生的內存。

(2)System.gc()

該方法不推薦,嚴重消耗性能,除非萬不得已,一般不用。

3.Java垃圾回收器工作

當垃圾回收器工作時候,它一面回收空間,一面是堆中的對象重新排列。通過對堆中的對象重新排列,實現了一種高速的、無限空間的可供分配的堆模型。

4. 簡單的垃圾回收技術:引用計數

引用計數:每個對象都有一個引用計數器,當有引用連接至對象時,引用計數器自動加1,當引用離開作用域或被置為null時,引用計數器減1,當對象的引用計數器為0時候,JVM會將對象回收。該方法需要在每一個對象上設置引用計數器,效率很低,而且在對象間循環引用時候,效果不好。

5.Java垃圾回收器的工作機制。

Java虛擬機采取了一種自適應的垃圾回收技術。

停止-復制:先暫停程序(它不屬於后台回收模式),然后將所有存活的對象從當前的堆中復制到另一個堆中,沒有復制的對象就是垃圾,而被復制到新堆中的對象會緊湊的排列。

標記-清掃:遍歷所有引用,進而找出多有存活的對象。當沒找到一個存活的對象,就會給對象標記,這個過程中不會清理任何對象。只有全部標記完成之后,才會清理垃圾。

在Java虛擬機運行過程中,如果所有對象穩定,垃圾回收器效率降低的話,就會切換到"標記-清掃";同意,Java虛擬機會跟蹤"標記-清掃"效果,要是堆空間出現很多碎片,就會切換到”停止-復制“;

6.Java提升速度的技術:JIT

JIT:just-in-time,及時編輯技術。該技術可以把程序翻譯成為本地機器碼。在JDK中,會智能的將一些經常使用的.class文件,編譯成字節碼裝入內存,因此Java的執行速度會得到提升。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM