<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 枚舉根節點、安全點、安全區域 在根可達性分析算法中,從GC Roots集合中找引用鏈是虛擬機高效實現的第一個例子。 ### 問題一:為什么要枚舉根節點?怎么高效實現? ![](https://img.kancloud.cn/50/07/500702775b23ca7437a7fca64518c486_1538x820.png) 雖然GC Roots的節點主要在全局性的引用(例如常量或者類靜態變量)與執行上下文(例如棧幀中的局部變量表),但是查找起來并發容易的事。 ### 問題一解決之道:使用根可達分析算法判斷垃圾,所以需要枚舉根節點。通過在安全點生成并維護OopMap來高效計算GC Roots集合。 為了解決某個時刻GC Roots集合的定位問題,在HotSpot中,有個數據結構(映射表)稱為**OopMap**。一旦類加載動作完成的時候,HotSpot就會把對象內什么偏移量上是什么類型的數據計算出來,記錄到OopMap。在即時編譯過程中,也會在**特定的位置**生成 OopMap,記錄下棧上和寄存器里哪些位置是引用。這樣在垃圾收集器在**枚舉根節點**時,就可以通過掃描OopMap中的對象快速得到當時的GC Roots集合。 (每個安全點都會生成對應的OopMap) ### 問題二:為什么需要安全點?安全點在哪些位置? 進行垃圾回收的過程中,會涉及對象的移動。為了保證對象引用更新的正確性,必須暫停所有的用戶線程(會發生STW)。線程并不是在任意位置都能中斷掛起的,只有在特定的位置才行。 這些特定的位置: * 方法調用 * 循環跳轉(非 counted 循環,固定循環次數) * 異常跳轉 稱之為**安全點**(每個安全點都會生成對應的OopMap),垃圾收集時,需要用戶線程到達安全點停下來后才開始執行。 在HotSpot中,采用主動式中斷的思想讓做垃圾收集時讓所有用戶現在都跑到最近安全點停頓下來。 是在安全點和分配對象時設置一個中斷標志,各線程執行時會不停輪詢這個標志,一旦發現為真時就在最近安全點主動掛起。 ### 問題三:為什么需要安全區域? 安全點的設計幾乎完美解決如何停頓用戶線程,讓虛擬機進入垃圾回收狀態。可如果用戶線程處于Sleep或者Blocked狀態時,線程是無法響應中斷請求的,虛擬機也不可能等待線程被激活后走到安全點掛起自己,這個時候就需要安全區域來解決了。 **安全區域**是指能夠確定在某一段代碼之中,引用關系不會發生變化,因此這個區域內任意地方開始垃圾回收都是安全的。(安全區域是擴展了的安全點)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看