天天看點

Java中的GC簡單介紹

文章目錄

    • 一、GC是什麼?
    • 二、為什麼要GC?
    • 三、怎麼GC?

一、GC是什麼?

GC英文全稱為Garbage Collection,即垃圾回收。

Java中的GC就是對記憶體的GC。

Java的記憶體管理實際上就是對象的管理,其中包括對象的配置設定和釋放。

我們知道對象的配置設定,程式員可以通過new關鍵字,Class的new-Instance方法等來顯示的配置設定;而對象的釋放,程式員不能實時的進行釋放,這就需要GC來完成。

二、為什麼要GC?

因為記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導緻程式或系統的不穩定甚至崩潰。是以,Java提供了GC功能。該功能可以自動監測對象是否超過作用域進而判斷是否需要回收記憶體。

GC有效的防止了記憶體洩漏,可以有效的使用可以使用的記憶體。

對于GC來說,當程式員建立對象時,GC就開始監控這個對象的位址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式确定哪些對象是"可達的",哪些對象是"不可達的".當GC确定一些對象為"不可達"時,GC就有責任回收這些記憶體空間。

注:判斷對象"不可達",一般有兩種方法,即引用計數法和可達性分析法。

三、怎麼GC?

目前商業Java虛拟機都采用分代收集的垃圾回收算法,即将對象的記憶體周期劃分為幾塊,按照每塊的情況采取不同的垃圾回收算法。

  • 一般是把Java堆分為新生代和老年代。
    • 年輕代:年輕代用來存放新近建立的對象,年輕代中存在的對象是死亡非常快的。存在朝生夕死的情況。
    • 老年代:老年代中存放的對象是存活了很久的對象。
  • 垃圾回收算法分為三種,分别為标記-清除算法,複制算法,标記-整理算法(注:這三種算法本文隻是簡單介紹,詳細資訊可以參考Java 垃圾回收機制與幾種垃圾回收算法)。
    • 标記-清除算法:标記無用對象,然後對其進行清除回收。
    • 複制算法:将記憶體區域劃分為大小相等的兩部分,每次隻使用一部分,當該部分用完後将其存活的對象移至另一部分,并把該部分記憶體全部清除。
    • 标記-整理算法:标記無用對象,讓所有存活的對象都向記憶體一端移動,然後清除掉存活對象邊界外的記憶體區域。