JVM hotspot虚拟机对象探秘
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
本文全部?jī)?nèi)容均轉(zhuǎn)述自《深入理解Java虛擬機(jī) JVM高級(jí)特性與最佳實(shí)踐(第二版)》2.3節(jié) 下載地址:http://pan.baidu.com/s/1jIFqx74 密碼:t517
主要講述的內(nèi)容主要是在常用的HotSpot虛擬機(jī)中,對(duì)象是如何在堆內(nèi)存中分配,布局和訪問(wèn)的。
分配
Java面向?qū)ο?#xff0c;時(shí)時(shí)刻刻有對(duì)象被創(chuàng)建出來(lái)。在語(yǔ)法上,我們通過(guò)new關(guān)鍵字可以創(chuàng)建一個(gè)新的對(duì)象。而當(dāng)虛擬機(jī)遇到new時(shí),會(huì)通過(guò)以下步驟創(chuàng)建一個(gè)對(duì)象,并為之分配內(nèi)存:
##分配內(nèi)存的細(xì)節(jié) 在分配的過(guò)程中,我們?cè)賮?lái)討論下2. 內(nèi)存分配的細(xì)節(jié)。
###分配方法分類
籠統(tǒng)來(lái)說(shuō),內(nèi)存分配方式可以分兩種:
指針碰撞(Bump the Pointer)。 這種方式可以理解成把所有內(nèi)存都當(dāng)成一個(gè)整體,中間用一個(gè)指針擺在中間,左邊全是用過(guò)的內(nèi)存,右邊全是沒(méi)用過(guò)的內(nèi)存,需要用的指定大小的內(nèi)存時(shí),左移分配內(nèi)存。使用這種分配方式垃圾收集器包括:Serial、ParNew等。
空閑列表(Free List)。內(nèi)存被分為一塊塊的空間,通過(guò)一個(gè)單獨(dú)的列表來(lái)記錄內(nèi)存中哪些內(nèi)存塊空閑,哪些已被使用。使用這種肥配方是的垃圾收集器包括CMS等。
###分配時(shí)的線程安全
由于這里討論的堆內(nèi)存是被多線程中共享的,所以在并發(fā)的過(guò)程中必須考慮線程安全問(wèn)題。同樣也有兩種方案:
#布局
對(duì)象在內(nèi)存中存儲(chǔ)的布局分為三塊
對(duì)象頭
存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù):Mark Word(在32bit和64bit虛擬機(jī)上長(zhǎng)度分別為32bit和64bit),包含如下信息:
- 對(duì)象hashCode
- 對(duì)象GC分代年齡
- 鎖狀態(tài)標(biāo)志(輕量級(jí)鎖、重量級(jí)鎖)
- 線程持有的鎖(輕量級(jí)鎖、重量級(jí)鎖)
- 偏向鎖相關(guān):偏向鎖、自旋鎖、輕量級(jí)鎖以及其他的一些鎖優(yōu)化策略是JDK1.6加入的,這些優(yōu)化使得Synchronized的性能與ReentrantLock的性能持平,在Synchronized可以滿足要求的情況下,優(yōu)先使用Synchronized,除非是使用一些ReentrantLock獨(dú)有的功能,例如指定時(shí)間等待等。
- 類型指針:對(duì)象指向類元數(shù)據(jù)的指針(32bit-->32bit,64bit-->64bit(未開(kāi)啟壓縮指針),32bit(開(kāi)啟壓縮指針))
- JVM通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例(根據(jù)對(duì)象確定其Class的指針)
##實(shí)例數(shù)據(jù)
對(duì)象真正存儲(chǔ)的有效信息
##對(duì)齊填充
JVM要求對(duì)象的大小必須是8的整數(shù)倍,若不是,需要補(bǔ)位對(duì)齊
Tips——對(duì)象起始地址必須是8字節(jié)的整倍數(shù),即對(duì)象大小必須是8字節(jié)的整倍數(shù)。
訪問(wèn)
Java虛擬機(jī)規(guī)范中指定了虛擬機(jī)要訪問(wèn)對(duì)象的時(shí)候是通過(guò)Java虛擬機(jī)棧中的reference來(lái)獲取對(duì)象地址的。但是并沒(méi)有指定reference如何保存以及通過(guò)它具體如何獲取對(duì)象地址。所以各家有各家的實(shí)現(xiàn)方案。
主要分兩種,一種是通過(guò)句柄(保存在Java堆特定的句柄池中)間接訪問(wèn),一種是直接在虛擬機(jī)棧中保存對(duì)象地址直接訪問(wèn)。HotSpot使用后一種方案。
轉(zhuǎn)載于:https://my.oschina.net/djzhu/blog/993928
總結(jié)
以上是生活随笔為你收集整理的JVM hotspot虚拟机对象探秘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为路由器 AX3 Pro 推送鸿蒙 H
- 下一篇: jquery页面滚动显示浮动菜单栏锚点定