关于Object o=new Object()的面试问题
1、解释一下对象的创建过程
2、DCL要不要加volatile问题
3、对象在内存中的存储布局
4、对象头具体包括什么
5、对象怎么定位
6、对象怎么分配
7、Object o=new Object()在内存中占用多少个字节
对象的创建过程
源码
class T{
int m=8;
}
T t=new T();
汇编码(字节码文件中的信息)
0 new #2 <T>
3 dup
4 invokespecial #3 <T.<init>>
7 astore_1
8 return
首先0 new #2 <T>会在内存中生成一块空间给t用,这块空间中会有一个m,默认值为0
接下来到了4 invokespecial #3 <T.<init>>表示构造方法,m的值变成了8
再接下来到了7 astore_1表示建立关联,t与真正new出来的对象建立关联
Object o=new Object()在内存中占用多少个字节
使用JOL类库可以看到
情况一:
输出
这个时候显示占用16个字节
情况二在类里面加了一个成员变量:
输出:
还是占用了16个字节
情况三往类里面再加一个成员变量:
输出:
这个时候占用了24个字节
所以创建的对象占了多少个字节,是可以算出来的,就牵扯到一个对象的构成也就是对象在内存中的存储布局
对象在内存中的存储布局
普通对象 new xx()由四部分构成:
其中markword包括该对象的锁信息、GC信息、hashcode信息。
其中对齐(padding)表示如果前三个部分占用的字节数不能被8整除,那么就会扩充字节数。
所以再看下一种情况:
输出:
对象怎么定位
句柄方式和指针方式
句柄方式
优点:对象小,垃圾回收不用频繁改动t
缺点:两次访问
直接指针
优点:直接访问
缺点:GC需要移动对象的时候麻烦
对象怎么分配
其中O表示老年代,E表示伊甸园区。