Object o = new Object()在内存中占几个字节
生活随笔
收集整理的這篇文章主要介紹了
Object o = new Object()在内存中占几个字节
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CAS:
Compare and Swap,即比較再交換。
jdk5增加了并發包java.util.concurrent.*,其下面的類使用CAS算法實現了區別于synchronouse同步鎖的一種樂觀鎖。JDK 5之前Java語言是靠synchronized關鍵字保證同步的,這是一種獨占鎖,也是是悲觀鎖。
?
?
?
?CAS算法理解
對CAS的理解,CAS是一種無鎖算法,CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做.
?
查看對象在內存中的布局:
引入依賴
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.10</version></dependency>?
?
對象在內存中的布共分為四部分:
?
?
對象在內存中的布共分為四部分:
Markword:主要存儲鎖的信息和GC的信息,占8個字節
類型指針class pointer :指向這個類在內存中的Class對象,占4個字節
實例數據 instance data : 這個類中實例對象所占的內存,如果int a 則占4個字節,如果時long b,則占8個字節
對齊padding:如果前邊幾個加起來的字節數不是8的整數倍,則填充補齊
所以Object o = new Object();在內存中共占用8+4+0+4共16個字節
?
?
?
?
?
?
鎖的升級:鎖的信息記錄在markword中.-
Object o = new Object();在對象剛剛被new出來時,沒有加任何鎖.用markdown中最低三位代表鎖狀態,其中一位是偏向鎖位,兩位是鎖標志位
-
此時線程A訪問該對象,因為A是第一個訪問該對象的線程,此時沒有其它線程競爭,o的markword的前54位指向了當前線程,此時為偏向鎖.
-
當線程A添加了偏向鎖之后,線程B也來訪問o對象,A,B兩個線程競爭.這兩個線程分別在各自的線程棧中生成一個Lock Record,以CAS的方式對o競爭加鎖,假設A成功,則o的markword指向線程A的Lock Record,線程B處于自旋狀態.此時o上添加的是輕量級鎖也叫自旋鎖,也叫無鎖.
-
當線程B自選次數超過10次,則向操作系統內核態申請重量級鎖資源
?
?
總結
以上是生活随笔為你收集整理的Object o = new Object()在内存中占几个字节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ1226 SDOI2009学校食
- 下一篇: 锁升级过程