<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 對象的內存布局 在HotSpot虛擬機中,對象的內存布局分為以下3個區域: * 對象頭 * 實例數據 * 對齊填充 ![](https://img.kancloud.cn/ce/c1/cec1a91e96673b1c679c0b6562b621f8_1938x1098.png) ### 對象頭 對象頭包含Mark Word和類型指針2個部分。如果是數組對象,則有一部分存儲數組的長度。 Mark Word中存儲: * 哈希嗎(HashCode) * GC分代年齡 * 鎖狀態標志 * 線程持有的鎖 * 偏向線程ID * 偏向時間戳 ### 類型指針 類型指針Klass存儲該對象的類對象的內存地址,可以通過該指針知道對象是屬于哪個類。 ### 實例數據 實例數據部分就是成員變量的值,其中包括父類成員變量和本類成員變量。 ### 對齊填充 保證對象內存大小是8字節的倍數,不足的部分按填充對齊。 ## 參考資料 * 周志明 * 《深入理解Java虛擬機》 ## 對象的創建過程 ![](https://img.kancloud.cn/db/e3/dbe3ad439a073dbb1b532a3444320af4_1452x1178.png) 1. 類加載檢查 先檢查對象的類是否加載,沒有加載則先加載類。(類加載完成后就能計算出對象的大小,請參考[Java如何計算對象大小](%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E5%AF%B9%E8%B1%A1%E5%A4%A7%E5%B0%8F.md) 2. 內存分配 給對象分配內存,如果使用TLAB,則優先在TLAB空間分配,再在Eden區分配。如果內存規整則使用指針碰撞方式分配內存,不規整則使用空閑列表方式分配內存。 * 指針碰撞 內存規整(說明垃圾回收采用的是標記整理算法),已使用內存和空閑內存分界線上放著一個指針左為分界指示器。只需要將指針移動往空閑內存一端移動對象大小的距離。 * 空閑列表 內存不規整(說明垃圾回收采用的是標記清除算法,有碎片),那么VM必須維護一個列表,記錄哪些內存是空閑可用的,分配時從空閑列表中找到一塊足夠大的內存給對象示例使用。 3. 初始化 * 設置零值 內存分配完成后,虛擬機會將分配到內存的空間都初始化為零值。(不包含對象頭) 這也保證了Java代碼不賦值初始化就直接使用,程序能訪問到這些字段的數據類型對應的零值。 * 設置對象頭信息 -- 設置klass指針為對應類對象的地址 -- 對象的hashCode -- 對象的分代年齡 等 * 執行構造方法`<init>` 執行對象所屬類定義的`init`構造方法,完成初始化。 至此,一個可用的對象才算是完全創建出來。 ## 對象的訪問方式 對象的存儲空間是在堆中分配的,但是這個對象的引用(存的是地址)卻是在棧中分配的。 Java程序通過棧上的`reference`引用來操作堆上的具體對象。 目前對象的訪問方式有句柄訪問和直接指針訪問方式。 ### 句柄訪問方式 ![](https://img.kancloud.cn/80/ba/80baa5cad3929ee49b449d6b042938a3_1370x702.png) 對象引用內存儲的是指向句柄地址,句柄對象中包含對象實例數據指針和類型數據指針。 ### 直接指針訪問方式 ![](https://img.kancloud.cn/55/fa/55fa4fdd18191458b964019ddf68f906_1362x704.png) 對象引用中存儲的是對象實例數據指針,再通過對象頭里的klass指針找到對象類型數據。 總結: 使用句柄方式訪問,優點是對象變化時棧中的reference的值不用改變,存儲的是穩定的句柄地址; 而使用直接指針方式訪問最大好處就是速度更快,它節省了一次指針定位的時間開銷。 HotSpot虛擬機采用直接指針的對象訪問方式。
                  <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>

                              哎呀哎呀视频在线观看