对象在内存中的存储布局
對象頭包含:
markword(和鎖相關的信息)? 8字節
class pointer(說明對象屬于哪個類),jvm指針八字節,但是默認壓縮,所有4個字節
對象體包含:
instance word實例數據(例如int,這就占四個字節,long就占八個)
padding 對齊,整體不能被八整除,就補齊八,為了提高效率
查看對象在內存中的情況,先導入classLayout jar包
下載地址:https://repo.maven.apache.org/maven2/org/openjdk/jol/jol-cli/?選xxxfull.jar
?
上圖中第一行開始地址是0,大小為4字節的,第二行開始地址是4,大小為4字節的 就是markword
第三行是class pointer(壓縮過了,四字節)
因為o沒有數據,所以總共大小是8+4=12,補齊之后是16
最后一行就是補齊了四個字節
?
?
剛new出來的對象,處于無鎖態,沒競爭的時候是偏向鎖,每次來看一看有沒有人用,沒有我繼續用,有競爭轉為自旋鎖,即輕量級鎖,一直自旋,如果競爭激烈,轉為重量級鎖。
可以看出,mark word不光有鎖信息,還有分代年齡信息
例:老年代很快滿了,分代從15改為31可行不?? 不可行,分代年齡總共四位,最大是15
上面的hashcode存的是identity hashcode,調用hahcode方法之后才有值,不然里面沒值。
偏向鎖:54位里面記錄了這個線程的id,下次有調用會對比id
輕量級鎖的62位,這些競爭的線程每個都有自己的lock Record來搶,通過自旋來搶,誰搶到誰的
?因為一直自旋太消耗cpu,所以轉到重量級鎖
?
鎖消除:
public void add(String s1,String s2){
? ? StringBuffer sb = new StringBuffer();
sb.append().append();
}
append是線程安全的,一直加鎖解鎖性能低,檢測到只在這個方法里用到sb的append,消除鎖不用。
總結
以上是生活随笔為你收集整理的对象在内存中的存储布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git clone时出现gnutls_h
- 下一篇: ArrayList的容量