Java GC機制及相關

來源:互聯網
上載者:User

Java GC機制及相關

  垃圾(Garbage)就是程式需要回收的對象,如果一個對象不在被直接或間接地引用,那麼這個對象就成為了「垃圾」,它佔用的記憶體需要及時地釋放,否則就會引起「記憶體泄露」。有些語言需要程式員來手動釋放記憶體(回收垃圾),有些語言有記憶體回收機制(GC),例如我正在學習的Java語言,存在記憶體回收機制。

    在學習Java GC 之前,我們需要記住一個單詞:stop-the-world 。它會在任何一種GC演算法中發生。stop-the-world 意味著JVM因為需要執行GC而停止了應用程式的執行。當stop-the-world 發生時,除GC所需的線程外,所有的線程都進入等待狀態,直到GC任務完成。GC最佳化很多時候就是減少stop-the-world 的發生,縮短因GC線程停機時間,保證程式啟動並執行效率。

第一種  標記清除

        標記清除(Mark and Sweep)是最早開發的GC演算法。

        原理:兩次掃描,第一次從根開始將可能被引用的對象進行以遞迴的方式進行標記標記,第二次將未標記的對象進行回收,回收成功後將標記的引用對象清除標記為下次的GC回收做準備。

        GC時間:與存活對象數和程式對象總數有關,因為要對所有對象進行遞迴查看是否可以進行回收。

思考:如果存活對象的數量少,那麼標記階段的實際標記很少,剩下的全為不在引用的對象,那麼標記階段的效率便會降低,從而整個GC過程的效率也會降低。

            標記清除的方式節省記憶體但是兩次掃描需要更多的時間,對於垃圾比例較小的情況佔優勢。

 

 

第二種  複製收集

            複製收集(Copy and Collection)會將從根開始被引用的對象複製到另外的空間中去,然後再捨棄掉舊的空間,利用新的空間。   

            原理:複製收集的方式只需要對對象進行一次掃描。準備一個「新的空間」,從根開始,對對象進行掃,如果存在對這個對象的引用,就把它複製到「新空間中」。一次掃描結束之後,所有存在於「新空間」的對象就是所有的非垃圾對象。

思考:複製收集具有局部性,在複製收集的過程中,會按照對象被引用的順序將對象複製到新空間中。於是,關係較近的對象被放在距離較近的記憶體空間的可能性會提高,這叫做局部性。局部性高的情況   下,記憶體緩衝會更有效地運作,程式的效能會提高。

        複製收集更快速但是需要額外開闢一塊用來複製的記憶體,對垃圾比例較大的情況佔優勢。

 

  第三種    引用計數

                引用計數是指,針對每一個對象,儲存一個對該對象的引用計數,該對象的引用增加,則相應的引用計數增加。如果對象的引用計數為零,則回收該對象。

                原理:每個對象中儲存該對象的引用計數,當引用發生增減時對計數進行更新,發生時間點:變數賦值、對象內容更新、函數結束(局部變數不再被引用)。當一個對象的引用計數為零時則說明它不再被引用,因此釋放相應的記憶體空間。

  

思考:引用計數最大的優點就是容易實現。成本小,基本上引用計數為0的時候垃圾會被立即回收,而其他方法難以預測對象的生命週期,垃圾存在的時間都會比這個方法長。這種記憶體回收方式產生的停機時間最短。

            但如果對象中存在循環參考,就無法被回收。引用計數不適合在並行中使用,多個線程同時操作引用計數,會引起數值不一樣的問題從而導致記憶體錯誤。所以引用計數必須採用獨佔方式,如果引用操作頻繁,那麼加鎖等並發控制機制的開銷是相當大的。

Java GC(記憶體回收機制)

      JVM GC只回收堆區和方法區內的對象。而棧區的資料,在超出範圍後會被JVM自動釋放掉,所以其不在JVM GC的管理範圍內。

  判定對象是否可回收的標準:

  1.             對象沒有引用
  2.             範圍發生未捕獲異常
  3.             程式在範圍正常執行完畢
  4.             程式執行了System.exit()
  5.               程式發生意外終止(被殺線程等)

      在Java程式中不能顯式的分配和登出緩衝,因為這些事情JVM都幫我們做了,那就是GC。

        有些時候我們可以將相關的對象設定成null 來試圖顯示的清除緩衝,但是並不是設定為null 就會一定被標記為可回收,有可能會發生逃逸。

        將對象設定成null 至少沒有什麼壞處,但是使用System.gc() 便不可取了,使用System.gc() 時候並不是馬上執行GC操作,而是會等待一段時間,甚至不執行,而且System.gc() 如果被執行,會觸發Full GC ,這非常影響效能。

 

      Java的記憶體回收是分代回收的,分為三代:新生代,老年代,持久代。

  新生代(Young generation):絕大多數最新被建立的對象都會被分配到這裡,由於大部分在建立後很快變得不可達,很多個物件被建立在新生代,然後“消失”。對象從這個地區“消失”的過程我們稱之為:Minor GC 。

      老年代(Old generation):對象沒有變得不可達,並且從新生代周期中存活了下來,在新生代的戰場上奮勇存活下來的對象,是不會輕易狗帶的,嘻嘻。會被拷貝到這裡。其地區分配的空間要比新生代多。也正由於其相對大的空間,發生在老年代的GC次數要比新生代少得多。對象從老年代中消失的過程,稱之為:Major GC 或者 Full GC。

      持久代(Permanent generation)也稱之為 方法區(Method area):用於儲存類常量以及字串常量。注意,這個地區不是用於儲存那些從老年代存活下來的對象,這個地區也可能發生GC。發生在這個地區的GC事件也被算為 Major GC 。只不過在這個地區發生GC的條件非常嚴苛,必須符合以下三種條件才會被回收:

                                          1、所有執行個體被回收

                                          2、載入該類的ClassLoader 被回收

                                          3、Class 對象無法通過任何途徑訪問(包括反射)

 

新生代和老年代的結構:  新生代空間的構成與邏輯

      為了更好的理解GC,我們來學習新生代的構成,它用來儲存那些第一次被建立的對象,它被分成三個空間:

        · 一個伊甸園空間(Eden)

      · 兩個倖存者空間(Fron Survivor、To Survivor)

      預設新生代空間的分配:Eden : Fron : To = 8 : 1 : 1

  每個空間的執行順序如下:

      1、絕大多數剛剛被建立的對象會存放在伊甸園空間(Eden)。

      2、在伊甸園空間執行第一次GC(Minor GC)之後,存活的對象被移動到其中一個倖存者空間(Survivor)。

      3、此後,每次伊甸園空間執行GC後,存活的對象會被堆積在同一個倖存者空間。

      4、當一個倖存者空間飽和,還在存活的對象會被移動到另一個倖存者空間。然後會清空已經飽和的哪個倖存者空間。

      5、在以上步驟中重複N次(N = MaxTenuringThreshold(年齡閥值設定,預設15))依然存活的對象,就會被移動到老年代。

      從上面的步驟可以發現,兩個倖存者空間,必須有一個是保持空的。如果兩個兩個倖存者空間都有資料,或兩個空間都是空的,那一定是你的系統出現了某種錯誤。

      我們需要重點記住的是,對象在剛剛被建立之後,是儲存在伊甸園空間的(Eden)。那些長期存活的對象會經由倖存者空間(Survivor)轉存到老年代空間(Old generation)。

      也有例外出現,對於一些比較大的對象(需要分配一塊比較大的連續記憶體空間)則直接進入到老年代。一般在Survivor 空間不足的情況下發生。

  老年代空間的構成與邏輯

      老年代空間的構成其實很簡單,它不像新生代空間那樣劃分為幾個地區,它只有一個地區,裡面儲存的對象並不像新生代空間絕大部分都是朝聞道,夕死矣。這裡的對象幾乎都是從Survivor 空間中熬過來的,它們絕不會輕易的狗帶。因此,Full GC(Major GC)發生的次數不會有Minor GC 那麼頻繁,並且做一次Major GC 的時間比Minor GC 要更長(約10倍)。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.