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