深入解析Java記憶體回收機制

來源:互聯網
上載者:User

標籤:回收   移動   基於   gen   image   add   永久代   清除   describe   

  • 引入記憶體回收
  • 哪些記憶體需要回收?
  • 引用計數法
  • 可達性分析
  • 如何回收
  • Marking 標記
  • Normal Deletion 清除
  • Deletion with Compacting 壓縮
  • 為什麼需要分代收集?
  • JVM的分代
  • 新生代
  • 老年代
  • 永久代
  • 分代垃圾收集過程詳述
引入記憶體回收

程式計數器、 虛擬機器棧、 本地方法棧3個地區隨線程而生,隨線程而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執行著出棧和入棧操作。 每一個棧幀中分配多少記憶體基本上是在類結構確定下來時就已知的(儘管在運行期會由JIT編譯器
進行一些最佳化,但在本章基於概念性模型的討論中,大體上可以認為是編譯期可知的),因此這幾個地區的記憶體配置和回收都具備確定性,在這幾個地區內就不需要過多考慮回收的問題,因為方法結束或者線程結束時,記憶體自然就跟隨著回收了。 而Java堆和方法區則不一樣,一個介面中的多個實作類別需要的記憶體可能不一樣,一個方法中的多個分支需要的記憶體也可能不一樣,我們只有在程式處於運行期間時才能知道會建立哪些對象,這部分記憶體的分配和回收都是動態,垃圾收集器所關注的是這部分記憶體-----《深入理解Java虛擬機器》

自動記憶體回收機制就是尋找Java堆中的對象,並對對象進行分類判別,尋找出正在使用的對象和已經不會使用的對象,然後把那些不會使用的對象從堆上清除。
自動記憶體回收機制就是要解決三個問題:

  • 哪些記憶體需要回收?
  • 什麼時候回收?
  • 如何回收?
哪些記憶體需要回收?引用計數法

對於第一個問題,也就是判斷是否還需要使用,最簡單的方法就是通過目前是否有引用指向這個對象,如果沒有就說明這個對象不會再被使用了,如果有就說明這個對象可能還會繼續被使用,這種通過引用是否存在的方法就叫做引用計數法,但這個方法存在一個問題就是無法解決對象循環參考的問題,因此又出現了可達性分析的方法來判斷對象是否可以被會回收。

可達性分析

這個演算法的基本思路就是通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連(用圖論的話來說,就是從GC Roots到這個對象不可達)時,則證明此對象是停用。
在Java語言中,可作為GC Roots的對象包括下面幾種:

  • 虛擬機器棧(棧幀中的本地變數表)中引用的對象。
  • 方法區中類靜態屬性引用的對象。
  • 方法區中常量引用的對象。
  • 本地方法棧中JNI(即一般說的Native方法)引用的對象。
如何回收

垃圾收集器通常會幫我們在後台自動進行記憶體回收。關於具體的回收過程只要有以下這些步驟

  • Step 1: Marking 標記

第一步就是標記,也就是垃圾收集器會找出那些需要回收的對象所在的記憶體和不需要回收的對象所在的記憶體,並把它們標記出來,簡單的說,也就是先找出垃圾在哪

所有堆中的對象都會被掃描一遍,以此來確定回收的對象,所以這通常會是一個相對比較耗時的過程

  • Step 2: Normal Deletion
    垃圾收集器會清除掉上一步標記出來的那些需要回收的對象地區

存在的問題就是片段問題:
標記清除之後會產生大量不連續的記憶體片段,空間片段太多可能會導致以後在程
序運行過程中需要分配較大對象時,無法找到足夠的連續記憶體而不得不提前觸發另一次垃圾收集動作。

  • Step 2a: Deletion with Compacting 壓縮
    由於簡單的清除可能會存在片段的問題,所以又出現了壓縮清除的方法,也就是先清除需要回收的對象,然後再對記憶體進行壓縮操作,將記憶體分成可用和不可用兩大部分

為什麼需要分代收集?

就像前文所述,標記對象和壓縮記憶體的過程在JVM中是不高效的,分配的對象越多,垃圾收集的時間就越長。但是,經過一些經驗型性的統計分析表明,一個程式中大部分對象都是短命的!

就是一個類似的統計資料,縱座標表示指派至所佔用的記憶體大小,橫座標表示自指派至過去的時間

我們看到,大部分對象沒活多久就死了,存活較久的只是少類對象

JVM的分代

為了增大垃圾收集的效率,所以JVM將堆進行分代,分為不同的部分,一般有三部分,新生代,老年代和永久代

新生代

所有新new出來的對象都會最先出現在新生代中,當新生代這部分記憶體滿了之後,就會發起一次垃圾收集事件,這種發生在新生代的垃圾收集稱為Minor collections。這種收集通常比較快,因為新生代的大部分對象都是需要回收的,那些暫時無法回收的就會被移動到老年代。

Stop the World事件-所有minor garbage collections都是Stop the World事件,也就是意味著所有的應用線程都需要停止,直到記憶體回收的操作全部完成。類似於
“你媽媽在給你打掃房間的時候,肯定也會讓你老老實實地在椅子上或者房間外待著,如果她一邊打掃,你一邊亂扔紙屑,這房間還能打掃完?”

老年代

老年代用來儲存那些存活時間較長的對象。一般來說,我們會給新生代的對象限定一個存活的時間,當達到這個時間還沒有被收集的時候就會被移動到老年代中。老年代地區的垃圾收集叫做major garbage collection

Major garbage collection也是一個Stop the World事件。通常Major garbage collection都相對比較慢,因為老年代的收集包括了對所有對象的收集,也就是同時需要收集新生代和老年代的對象。

永久代

The Permanent generation contains metadata required by the JVM to describe the classes and methods used in the application. The permanent generation is populated by the JVM at runtime based on classes in use by the application. In addition, Java SE library classes and methods may be stored here.

Classes may get collected (unloaded) if the JVM finds they are no longer needed and space may be needed for other classes. The permanent generation is included in a full garbage collection.

分代垃圾收集過程詳述

我們已經知道記憶體回收所需要的方法和堆記憶體的分代,那麼接下來我們就來具體看一下記憶體回收的具體過程

  • 第一步 所有new出來的對象都會最先分配到新生代地區中,兩個survivor地區初始化是為空白的

  • 第二步,當eden地區滿了之後,就引發一次 minor garbage collection

  • 第三步,當在minor garbage collection,存活下來的對象就會被移動到S0survivor地區

  • 第四步,然後當eden地區又填滿的時候,又會發生下一次的記憶體回收,存活的對象會被移動到survivor地區而未存活對象會被直接刪除。但是,不同的是,在這次的記憶體回收中,存活對象和之前的survivor中的對象都會被移動到s1中。一旦所有對象都被移動到s1中,那麼s2中的對象就會被清除,仔細觀察圖中的對象,數字表示經曆的垃圾收集的次數。目前我們已經有不同的年齡對象了。

  • 第五步,下一次記憶體回收的時候,又會重複上次的步驟,清除需要回收的對象,並且又切換一次survivor地區,所有存活的對象都被移動至s0。eden和s1地區被清除。

  • 第六步,重複以上步驟,並記錄對象的年齡,當有對象的年齡到達一定的閾值的時候,就將新生代中的對象移動到老年代中。在本例中,這個閾值為8.

  • 第七步,接下來垃圾收集器就會重複以上步驟,不斷的進行對象的清除和年代的移動

  • 最後,我們觀察上述過程可以發現,大部分的垃圾收集過程都是在新生代進行的,直到老年代中的記憶體不夠用了才會發起一次 major GC,會進行標記和整理壓縮。

深入解析Java記憶體回收機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.