对象的创建过程

关于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表示伊甸园区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值