上一篇 <<<并發(fā)編程-Lock鎖
下一篇 >>>并發(fā)編程-AQS同步器
對象整體圖示
1.虛擬機Mark Word圖示
a、32位虛擬機圖示
b、64位虛擬機圖示
[markOop.hpp文件]
enum { locked_value = 0, // 0 00 輕量級鎖
unlocked_value = 1,// 0 01 無鎖
monitor_value = 2,// 0 10 重量級鎖
marked_value = 3,// 0 11 gc標(biāo)志
biased_lock_pattern = 5 // 1 01 偏向鎖
};
c船惨、虛擬機設(shè)置說明(markOop.hpp)
2.類型指針Klass Pointer
該指針指向它的類元數(shù)據(jù),jvm通過這個指針確定對象是哪個類的實例炼吴。
該指針的位長度為JVM的一個字大小,即32位的JVM為32位疫衩,64位的JVM為64位硅蹦。
如果應(yīng)用的對象過多,使用64位的指針將浪費大量內(nèi)存,統(tǒng)計而言童芹,64的JVM將會比32位的JVM多耗費50的內(nèi)存涮瞻。為了節(jié)約內(nèi)存可以使用選項 -XX:+UseCompressedOops 開啟指針壓縮。
其中 oop即ordinary object pointer 普通對象指針假褪。
-XX:+UseCompressedOops 開啟指針壓縮
-XX:-UseCompressedOops 不開啟指針壓縮
對象頭:Mark Word+Klass Pointer類型指針 未開啟壓縮的情況下
32位 Mark Word =4bytes 署咽,類型指針 4bytes ,對象頭=8bytes =64bits
64位 Mark Word =8bytes 生音,類型指針 8bytes 宁否,對象頭=16bytes=128bits;
注意:默認(rèn)情況下缀遍,開啟了指針壓縮 可能只有12字節(jié)慕匠。
3.實例屬性
int 32bit 4byte
short 16bit 2byte
long 64bit 8byte
byte 8bit
char 16bit
float 32bit
double 64bit
boolean 1bit
4.對齊填充
對齊填充并不是必然存在的,也沒有特定的含義域醇,僅僅起著占位符的作用台谊。
由于HotSpot虛擬機的自動內(nèi)存管理系統(tǒng)要求對象的起始地址必須是8字節(jié)的整數(shù)倍,也就是對象的大小必須是8字節(jié)的整數(shù)倍譬挚。
而對象頭部分正好是8字節(jié)的倍數(shù)(1倍或者2倍)锅铅,因此,當(dāng)對象實例數(shù)據(jù)部分沒有對齊的時候减宣,就需要通過對齊填充來補全盐须。
演示效果
public static void main(String[] args) {
Test002 lock = new Test002();
// 底層存的是16進(jìn)制
System.out.println(Integer.toHexString(lock.hashCode()));
System.out.println(ClassLayout.parseInstance(lock).toPrintable());
}
new對象至少占用了多少字節(jié)
占用字節(jié)數(shù)=對象頭+實例數(shù)據(jù)+對齊填充的總數(shù),且必須是8的倍數(shù)
如果是32位的操作系統(tǒng)蚪腋,對象頭占8個字節(jié)
如果是64位的操作系統(tǒng),未壓縮對象頭占16個字節(jié)姨蟋,壓縮對象頭占12個字節(jié)屉凯。
tips:
1、對象頭的使用情況請參考并發(fā)編程-鎖的優(yōu)化
2眼溶、對象的初始化情況請參考JVM基礎(chǔ)-對象初始化
相關(guān)文章鏈接:
<<<Java基礎(chǔ)-反射機制
<<<Java基礎(chǔ)-字節(jié)碼技術(shù)
<<<Java基礎(chǔ)-創(chuàng)建對象的方式匯總
<<<Java基礎(chǔ)-對象的引用類型
<<<Class文件分析一個類為啥最多支持65535個接口
<<<為什么重寫equals還要重寫hashcode方法
<<<如何自定義注解
<<<十大經(jīng)典排序算法匯總-動畫演示
<<<JDK8十大新特性