JVM hotspot虚拟机对象探秘
為什么80%的碼農都做不了架構師?>>> ??
本文全部內容均轉述自《深入理解Java虛擬機 JVM高級特性與最佳實踐(第二版)》2.3節 下載地址:http://pan.baidu.com/s/1jIFqx74 密碼:t517
主要講述的內容主要是在常用的HotSpot虛擬機中,對象是如何在堆內存中分配,布局和訪問的。
分配
Java面向對象,時時刻刻有對象被創建出來。在語法上,我們通過new關鍵字可以創建一個新的對象。而當虛擬機遇到new時,會通過以下步驟創建一個對象,并為之分配內存:
##分配內存的細節 在分配的過程中,我們再來討論下2. 內存分配的細節。
###分配方法分類
籠統來說,內存分配方式可以分兩種:
指針碰撞(Bump the Pointer)。 這種方式可以理解成把所有內存都當成一個整體,中間用一個指針擺在中間,左邊全是用過的內存,右邊全是沒用過的內存,需要用的指定大小的內存時,左移分配內存。使用這種分配方式垃圾收集器包括:Serial、ParNew等。
空閑列表(Free List)。內存被分為一塊塊的空間,通過一個單獨的列表來記錄內存中哪些內存塊空閑,哪些已被使用。使用這種肥配方是的垃圾收集器包括CMS等。
###分配時的線程安全
由于這里討論的堆內存是被多線程中共享的,所以在并發的過程中必須考慮線程安全問題。同樣也有兩種方案:
#布局
對象在內存中存儲的布局分為三塊
對象頭
存儲對象自身的運行時數據: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虚拟机对象探秘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为路由器 AX3 Pro 推送鸿蒙 H
- 下一篇: jquery页面滚动显示浮动菜单栏锚点定