首頁>技術>

前言

今天同學在課前演講,大致講了一下java虛擬機器,講的很快也很淺,反正聽的迷迷糊糊的,自己下來從新進行查詢資料進行整理學習,先將JVM裡面的垃圾回收機制中演算法進行歸攏,整理如下。

垃圾回收機制圖垃圾物件判定標準

JVM的GC工作主要針對的物件是堆記憶體,在做GC工作之前,首先要判定堆記憶體中的物件例項是否為垃圾,通常使用以下兩種演算法來定義

1.引用計數演算法

java在執行時,當有一個地方引用該物件例項,會將這個物件例項加1,引用失效時就減1,jvm在掃描記憶體時,發現引用計數值為0的則是垃圾物件,計數值大於0的則為活躍物件。

目前垃圾回收演算法,沒有采用引用計數演算法,原因是在物件互相引用的情況下,無法判定兩者是否為垃圾物件。

2.根搜尋演算法

根搜尋演算法是以“GC ROOTS”為起始點往下搜尋,所有經過的物件合併起來稱為引用鏈,在這引用鏈裡,沒有的物件稱為垃圾物件,(實際上jvm還做了一個篩選動作,判定當前物件是否執行finalize()方法,如果不需要執行才判定為垃圾物件,這裡不做介紹),在引用鏈裡的是活躍物件。那什麼樣的物件才能稱為“GC ROOTS”呢?以下四種可以

虛擬機器棧(棧幀中的本地變量表)中引用的物件。方法區中的類靜態屬性引用的物件。方法區中的常量引用的物件。本地方法棧中 JNI(Native 方法)的引用物件。垃圾回收演算法1. 標記-清除(Mark-Sweep)

JVM會掃描所有的物件例項,透過根搜尋演算法,將活躍物件進行標記,jvm再一次掃描所有物件,將未標記的物件進行清除,只有清除動作,不作任何的處理,這樣導致的結果會存在很多的記憶體碎片。

2. 複製(copying)

JVM掃描所有物件,透過根搜尋演算法標記被引用的物件,之後會申請新的記憶體空間,將標記的物件複製到新的記憶體空間裡,存活的物件複製完,會清空原來的記憶體空間,將新的記憶體最為JVM的物件儲存空間。這樣雖然解決了記憶體記憶體碎片問題,但是如果物件很多,重新申請新的記憶體空間會很大,在記憶體不足的場景下,會對JVM執行造成很大的影響

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

標記整理實際上是在標記清除演算法上的最佳化,執行完標記清除全過程之後,再一次對記憶體進行整理,將所有存活物件統一向一端移動,這樣解決了記憶體碎片問題。

4. 分代回收

目前JVM常用回收演算法就是分代回收,年輕代以複製演算法為主,老年代以標記整理演算法為主。原因是年輕代物件比較多,每次垃圾回收都有很多的垃圾物件回收,而且要儘可能快的減少生命週期短的物件,存活的物件較少,這時候複製演算法比較適合,只要將有標記的物件複製到另一個記憶體區域,其餘全部清除,並且複製的數量較少,效率較高;而老年代是年輕代篩選出來的物件,被標記比較高,需要刪除的物件比較少,顯然採用標記整理效率較高。

11
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python學科:十大Markdown語法簡明教程