jclasslib Bytecode viewer IDEA安裝
選擇某個類,再選擇view-show bytecode with jclasslib 找到method 裏面有比如init初始化方法,main方法 ,查看指令
public class Ts {
private String name;
public static void main(String[] args) {
Ts s = new Ts();
}
}
對應字節碼如下:
0 new #2 <com/jsdc/client/Ts> ---------------------------再堆裏開闢一塊空間
3 dup --------------------------- copy棧頂的部分拿過來用
4 invokespecial #3 <com/jsdc/client/Ts.<init>>---------------------------執行初始化,包括屬性賦值等
7 astore_1 --------------------------- 對象引用,指向堆內存空間
8 return
面試題:
單例DCL(double check lock雙重鎖檢查,if(object==null) 鎖住,再if(object==null) new .mashibing單例模式,雙重檢查版)需不需要給單例對象加volatile ?
答:是需要的,結合上面的過程,可以看出 ,如果在初始化和指向位置進行了指令重排序(cpu的速度比內存快至少百倍,cpu底層機制會這麼操作:指令1發出去以後,不等到返回數據,就先執行指令2),那麼,單例模式--懶漢,會出現,對象半初始化的時候(new 開闢了空間,還沒有初始化,就被引用指向了,並返回),已經不爲null,其他線程就會拿過來用。
2.對象內存中存儲佈局?可以引入jol-core(org-openjdk-jol) ,百度使用方法,觀察類佈局代碼
自上而下分別是:
1.(前面8個字節)markword --最主要的包含 lock , hashcode
2.class point---指向類的class,類型
3.(數組會多一個長度,length)
4.instance data初始化數據---如屬性name 的值
5.對齊
3.對象頭包含哪些?
對象頭:
1.markword 包含 lock ,hashcode,詳見hotspot源碼
2.class point(klass point)對象類型信息