JVM的垃圾回收算法詳解,不看實在是太虧了!

前言

今天同窗在課前演講,大體講了一下java虛擬機,講的很快也很淺,反正聽的迷迷糊糊的,本身下來重新進行查找資料進行整理學習,先將JVM裏面的垃圾回收機制中算法進行歸攏,整理以下,若有錯誤或不足請留言或私信告知,定會改正!java

垃圾回收機制圖

JVM的垃圾回收算法詳解,不看實在是太虧了!

垃圾對象斷定標準

JVM的GC工做主要針對的對象是堆內存,在作GC工做以前,首先要斷定堆內存中的對象實例是否爲垃圾,一般使用如下兩種算法來定義算法

1.引用計數算法jvm

java在運行時,當有一個地方引用該對象實例,會將這個對象實例加1,引用失效時就減1,jvm在掃描內存時,發現引用計數值爲0的則是垃圾對象,計數值大於0的則爲活躍對象。ide

目前垃圾回收算法,沒有采用引用計數算法,緣由是在對象互相引用的狀況下,沒法斷定二者是否爲垃圾對象。學習

2.根搜索算法優化

根搜索算法是以「GC ROOTS」爲起始點往下搜索,全部通過的對象合併起來稱爲引用鏈,在這引用鏈裏,沒有的對象稱爲垃圾對象,(實際上jvm還作了一個篩選動做,斷定當前對象是否執行finalize()方法,若是不須要執行才斷定爲垃圾對象,這裏不作介紹),在引用鏈裏的是活躍對象。那什麼樣的對象才能稱爲「GC ROOTS」呢?如下四種能夠對象

  • 虛擬機棧(棧幀中的本地變量表)中引用的對象。
  • 方法區中的類靜態屬性引用的對象。
  • 方法區中的常量引用的對象。
  • 本地方法棧中 JNI(Native 方法)的引用對象。

垃圾回收算法

1. 標記-清除(Mark-Sweep)

JVM的垃圾回收算法詳解,不看實在是太虧了!
JVM會掃描全部的對象實例,經過根搜索算法,將活躍對象進行標記,jvm再一次掃描全部對象,將未標記的對象進行清除,只有清除動做,不做任何的處理,這樣致使的結果會存在不少的內存碎片。blog

2. 複製(copying)

JVM的垃圾回收算法詳解,不看實在是太虧了!
JVM掃描全部對象,經過根搜索算法標記被引用的對象,以後會申請新的內存空間,將標記的對象複製到新的內存空間裏,存活的對象複製完,會清空原來的內存空間,將新的內存最爲JVM的對象存儲空間。這樣雖然解決了內存內存碎片問題,可是若是對象不少,從新申請新的內存空間會很大,在內存不足的場景下,會對JVM運行形成很大的影響生命週期

3. 標記-整理(Mark-compact)

JVM的垃圾回收算法詳解,不看實在是太虧了!
標記整理其實是在標記清除算法上的優化,執行完標記清除全過程以後,再一次對內存進行整理,將全部存活對象統一貫一端移動,這樣解決了內存碎片問題。內存

4. 分代回收

JVM的垃圾回收算法詳解,不看實在是太虧了!
目前JVM經常使用回收算法就是分代回收,年輕代以複製算法爲主,老年代以標記整理算法爲主。緣由是年輕代對象比較多,每次垃圾回收都有不少的垃圾對象回收,並且要儘量快的減小生命週期短的對象,存活的對象較少,這時候複製算法比較適合,只要將有標記的對象複製到另外一個內存區域,其他所有清除,而且複製的數量較少,效率較高;而老年代是年輕代篩選出來的對象,被標記比較高,須要刪除的對象比較少,顯然採用標記整理效率較高。

結束語

因爲我的能力問題,暫時只能整理出目前這些知識,但願能對你們有幫助,關於JVM的具體內容,在下必定會盡快更新,盡請期待!!

相關文章
相關標籤/搜索