jclasslib Bytecode viewer 查看字節碼

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)對象類型信息

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章