【JVM】程序員進階JVM(二)——垃圾回收算法

一、前言

      上一篇博客中,小編向大家開了個頭,介紹了一些JVM的內存區域,相信大家一想起四象限,就可以想起JVM的內存區域:棧,方法區,堆,程序計數器。在這篇博客中,小編向大家介紹垃圾回收算法。

二、什麼是垃圾回收?

      對JVM有一定了解的,或者對java有一定了解的都知道Jvm有一個很大的特點就是垃圾回收機制。在JVM中有7種垃圾回收器,他們根據不同的算法去回收在內存中卻沒有被使用的對象。這就是垃圾回收。

      回收垃圾也就是回收沒有用的對象。

垃圾回收器回收哪裏的內存呢?

      如果你是一個jvm設計師,你會怎麼安排回收內存呢?

      這是一個很好的問題,通過上一篇博客,小編相信大家通過對四象限的認識,已經對jvm內存的分佈有了一些瞭解。在我們使用的過程中,不同的對象放到了不同的區域。我們要找到已經死去的對象,這裏jvm提供了兩種方案:

  •       引用計數算法

      計數器來記錄對象引用的次數。如果引用了就+1,減少引用了就-1。從而產生了相互引用的問題。

  •       可達性分析算法

      從起始點“GC Root”開始向下搜索,可以搜索鏈接到的就是存活的,鏈接不到的就是死的對象,可以被回收。(java 、C#就是使用的這種)

這裏寫圖片描述

      注意:在使用可達性分析算法的時候,並不是鏈接不到的對象,就是“非死不可”。jvm會給這種對象兩次機會,把這些對象置於“緩刑”。第一次沒有連接到 ,就被標記,然後判斷對象是否執行了finalize()方法,如果沒有執行,就可以通過執行finalize()方法進行自救。否則會死亡,從而被回收。

什麼時候回收?

      通過上面的兩個算法,我們就可以篩選出那些對象是可以回收的,那些對象是不可以回收的。那麼上面時候開始回收呢?

      我們有一個屋子,裏面放着好多自己的東西,有的東西我們經常用,有的東西不經常用,而且我們還會時不時的向這個屋子裏面放一些新的東西。屋子越來越滿,空間越來越小。自然而然,當空間小的時候,空間緊張的時候我們就會回收一些扔一些東西。扔那些我們用不到的東西

      代碼如人生。

      生活中我們會在空間不足的時候扔東西,所以計算機內存管理中,也會在內存不足的時候,對垃圾進行回收。

      基本是在內存不夠用的時候。每個收集器還所有不同。

      垃圾回收基本的思想是:stop-the-world再回收,就如:不能在打掃衛生的時候同時再仍新的垃圾。

      但是CMS、與將出世的 G1會打破這個界限,實現 邊打掃衛生,還邊扔垃圾。

誰來回收?

      垃圾回收器

怎麼回收?

      不同的垃圾回收器根據不同的算法進行回收。

三、垃圾回收算法

標記-清除法

      這是最基礎的算法,從命名上可以看出分爲兩步:1.標記 2.清除。

首先標記出所有要回收的對象,然後統一回收。

      不足:

      1.效率不高
      2.容易產生垃圾碎片

      通過下面的圖看出,黑色的是可以回收的,收集器會把可以回收的標記出來,需要回收的時候,就統一回收。產生了很多的內存碎片。

這裏寫圖片描述

複製法

      特點:

      內存分成兩個大小相等的兩塊。

      每次只使用一塊,當這塊內存用完了,就將還存活的複製到另一塊上。

      然後把已使用過的內存空間一次清理掉。

      對半個進行操作,不用考慮內存碎片問題

      移動堆頂的指針,按順序分配內存

      好處:

      簡單 高效

這裏寫圖片描述

標記-整理法

      特點:

      先標記,所有的存活對象都向一端移動,直接清理掉端邊界以外的內存

這裏寫圖片描述

分代收集法

特點:

商業虛擬機都採用這個

根據對象存活週期的不同將內存劃分爲幾塊,每塊用不同的算法。

      說明:

      一般把java堆分爲“年輕代”和“老年代”。

      年輕代中存放的對象生命週期短,大部分都會被回收,所以採用“複製法”。爲了更好的對內存分配和回收,年輕代又分成了Eden 、s1、s2區。他們的比例大約是8:1:1。大部分對象都存放到Eden區,Eden區和s1中的98%的數據都會被回收,所以採用複製法,把Eden和s1中存活的數據(不到10%)複製到s2上,然後清除Eden和s1區。完成垃圾回收。

      老年代中的數據生存週期長,沒有額外的空間對其進行擔保,使用“標記-整理法”或者“標記-清除法”來進行垃圾回收。

四、小結

      通過這次的學習,相信可以對垃圾回收機制有所瞭解吧。這些可是JVM的重點哦,下一篇博客中,會向大家介紹jvm中的7中垃圾回收器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章