<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          哦?原來這就是 JVM 垃圾!

          共 1751字,需瀏覽 4分鐘

           ·

          2021-09-14 21:05

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

          大家都知道,JVM 有垃圾回收的機制,垃圾回收的前提是要知道:什么是垃圾!然后再是如何識別垃圾

          什么是垃圾

          垃圾,本質(zhì)上就是沒有引用的對象(們),下面來介紹兩種垃圾

          1. 沒有引用指向的對象

          下圖是對象間引用的狀態(tài),從正常引用到引用斷開,這個 A 和 C 的引用斷開之后,C 就成了那個垃圾。

          2. 沒有引用指向的一組對象

          一個典型的案例如下圖,就是循環(huán)引用,這幾個對象看起來都有引用指向,但是其實他們只是一堆緊緊相擁的垃圾。

          如何識別垃圾

          上面介紹了什么是垃圾,那要如何才能識別出垃圾呢?主要有兩種算法:

          1. 引用計數(shù)法

          2. 可達性分析法

          1. 引用計數(shù)法

          算法很簡單,就是在對象頭上加上被引用的次數(shù),對象的被引用的次數(shù)為 0 之日,就是其成為垃圾之時!這個算法的優(yōu)點是垃圾回收及時,只要對象被引用次數(shù)為 0,就可以回收了。

          下圖是引用計數(shù)的示意圖,對象 A、B、C 都被引用了一次

          如果 A 跟 C 的引用斷開,則 C 的引用次數(shù)減一,變?yōu)?0,此時 C 就是垃圾

          引用計數(shù)法有個致命的缺點:那就是無法識別出循環(huán)引用!
          下圖是一個循環(huán)引用,明明他們就是一堆垃圾,但是因為被引用次數(shù)都不為 0,引用計數(shù)法無法識別出他們是垃圾。

          2. 可達性分析法

          引用計數(shù)法的缺點過于致命,目前 JVM 采用的是另一種算法來識別垃圾:可達性分析法。

          這個算法的基本思路就是:從一系列根對象(GC Roots)開始,根據(jù)引用關(guān)系向下搜索,如果某個對象到 GC Roots 間沒有任何引用,則證明此對象是不可能再被使用的,也就是垃圾。

          其示意圖如下,左邊綠色部分的對象,都可以連向 GC Roots,所以他們都是存活的對象。而右邊灰色的部分,即使他們是循環(huán)引用,他們也跟 GC Roots 之間沒有連接路徑,所以灰色部分的對象是垃圾。

          那么,究竟是哪些對象能成為至高無上的 GC Roots 呢?以下是主要的 GC Roots:

          • 虛擬機中引用的對象,如各個線程調(diào)用的方法堆棧中的參數(shù)、局部變量等。

          • 方法區(qū)中類的靜態(tài)屬性引用的對象,如類的引用類型的靜態(tài)變量。

          • 方法區(qū)中常量引用的對象,如字符串常量池里的引用。

          • 本地方法棧中 JNI(Native 方法)引用的對象。

          • 虛擬機內(nèi)部的引用,如基本數(shù)據(jù)類型對應(yīng)的 Class 對象,一些常駐的異常對象(比如 NullPointExcepitonOutOfMemoryError)等,還有系統(tǒng)類加載器。

          優(yōu)點:解決引用計數(shù)器所不能解決的循環(huán)引用問題。
          缺點:

          1. 耗時:因為需要從 GC Roots 開始逐個檢查引用;

          2. STW:GC 過程中需要保證對象的引用關(guān)系不能發(fā)生變化,所以 GC 進行時必須停頓所有執(zhí)行線程(STW:Stop The World)。

          總結(jié)

          第一部分我們介紹了什么是垃圾:沒有任何引用指向的一個或多個對象。
          第二部分介紹了如何識別垃圾,有兩種算法:

          1. 引用計數(shù)法:通過給對象添加被引用的次數(shù)來識別。優(yōu)點是回收簡單及時;缺點是無法解決循環(huán)引用。

          2. 可達性分析法:從一系列根對象(GC Roots)開始,根據(jù)引用關(guān)系向下搜索,如果某個對象到 GC Roots 間沒有任何引用,則此對象就是垃圾。優(yōu)點是解決了循環(huán)引用;缺點是耗時和 STW。



            作者 |  小新是也

          來源 |  cnblogs.com/chenchuxin/p/15256320.html


          加鋒哥微信: java3459  
          圍觀鋒哥朋友圈,每天推送Java干貨!

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女逼网站| 日本一级A片在线观看 | 免费看一级乱伦片 | 蜜桃久久av一区 免费大免费黄在线 | 精品国产91豆花视频 |