日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM hotspot虚拟机对象探秘

發布時間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM hotspot虚拟机对象探秘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

本文全部內容均轉述自《深入理解Java虛擬機 JVM高級特性與最佳實踐(第二版)》2.3節 下載地址:http://pan.baidu.com/s/1jIFqx74 密碼:t517

主要講述的內容主要是在常用的HotSpot虛擬機中,對象是如何在堆內存中分配,布局和訪問的。

分配

Java面向對象,時時刻刻有對象被創建出來。在語法上,我們通過new關鍵字可以創建一個新的對象。而當虛擬機遇到new時,會通過以下步驟創建一個對象,并為之分配內存

  • 【類加載檢查】檢查常量池是否能定位到類的符號引用。如果對應的類沒有被加載、解析和初始化,則執行相應過程。
  • 【分配內存】在前一個步驟已經知道類對應的對象所需的內存大小,這一步要做的是找到合適大小的內存空間。
  • 【內存空間初始化】初始化為零值。
  • 【對象頭初始化】把包括對象是哪個類的實例、如何找到類的元數據信息、對象哈希碼、對象的GC年代等信息保存到對象頭中。
  • 【執行init方法】根據對象初始化構造參數,調用相應的<init>方法,把字段設為需要的值(而非零值)。
  • ##分配內存的細節 在分配的過程中,我們再來討論下2. 內存分配的細節。

    ###分配方法分類

    籠統來說,內存分配方式可以分兩種:

  • 指針碰撞(Bump the Pointer)。 這種方式可以理解成把所有內存都當成一個整體,中間用一個指針擺在中間,左邊全是用過的內存,右邊全是沒用過的內存,需要用的指定大小的內存時,左移分配內存。使用這種分配方式垃圾收集器包括:Serial、ParNew等。

  • 空閑列表(Free List)。內存被分為一塊塊的空間,通過一個單獨的列表來記錄內存中哪些內存塊空閑,哪些已被使用。使用這種肥配方是的垃圾收集器包括CMS等。

  • ###分配時的線程安全

    由于這里討論的堆內存是被多線程中共享的,所以在并發的過程中必須考慮線程安全問題。同樣也有兩種方案:

  • 同步。同步控制每一個內存分配動作。
  • Thread Local Allocation Buffer, TLAB。為不同線程劃分特定的內存空間,一般情況下線程只在自己的分配空間內操作,只有TLAB空間用完才同步鎖定,進行新的全局分配。
  • #布局

    對象在內存中存儲的布局分為三塊

    對象頭

    存儲對象自身的運行時數據:Mark Word(在32bit和64bit虛擬機上長度分別為32bit和64bit),包含如下信息:

    • 對象hashCode
    • 對象GC分代年齡
    • 鎖狀態標志(輕量級鎖、重量級鎖)
    • 線程持有的鎖(輕量級鎖、重量級鎖)
    • 偏向鎖相關:偏向鎖、自旋鎖、輕量級鎖以及其他的一些鎖優化策略是JDK1.6加入的,這些優化使得Synchronized的性能與ReentrantLock的性能持平,在Synchronized可以滿足要求的情況下,優先使用Synchronized,除非是使用一些ReentrantLock獨有的功能,例如指定時間等待等。
    • 類型指針:對象指向類元數據的指針(32bit-->32bit,64bit-->64bit(未開啟壓縮指針),32bit(開啟壓縮指針))
    • JVM通過這個指針來確定這個對象是哪個類的實例(根據對象確定其Class的指針)

    ##實例數據

    對象真正存儲的有效信息

    ##對齊填充

    JVM要求對象的大小必須是8的整數倍,若不是,需要補位對齊

    Tips——對象起始地址必須是8字節的整倍數,即對象大小必須是8字節的整倍數。

    訪問

    Java虛擬機規范中指定了虛擬機要訪問對象的時候是通過Java虛擬機棧中的reference來獲取對象地址的。但是并沒有指定reference如何保存以及通過它具體如何獲取對象地址。所以各家有各家的實現方案。

    主要分兩種,一種是通過句柄(保存在Java堆特定的句柄池中)間接訪問,一種是直接在虛擬機棧中保存對象地址直接訪問。HotSpot使用后一種方案。

    轉載于:https://my.oschina.net/djzhu/blog/993928

    總結

    以上是生活随笔為你收集整理的JVM hotspot虚拟机对象探秘的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。