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

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

在Java中,咱們new完對象以後,垃圾回收器負責回收無用的對象佔據的內存資源。這與C++不一樣,在C++中,准許使用局部對象,回收對象時候,須要用到finalize()析構函數。C++的對象建立在堆棧中,而Java對象建立在堆中,因此咱們建立完對象以後,Java的垃圾回收器在堆中,會自動幫咱們回收垃圾,至於什麼時候回收垃圾,咱們不得而知了。性能

2.垃圾回收用到的方法spa

(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的執行速度會獲得提高。

相關文章
相關標籤/搜索