jclasslib Bytecode viewer 查看字节码

    技术2026-03-20  22

    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)对象类型信息

     

     

    Processed: 0.010, SQL: 9