对象的创建过程
- 分配内存,默认值是0
- 调用构造方法,初始值为8
- astore_1 建立关联 t ---->new T()
DCL和volatile问题(禁止指令重排)
对象在内存中的存储布局
对象头包括 markword(8个字节) + class pointer(4个字节),
loss due to the next object alignment 对 齐,目的是成为8个倍数。
对象头具体包括什么?
主要包括锁的信息。synchronized锁定的是一个对象(给对象加锁),而不是锁定代码。
锁升级的过程——new -->偏向锁–>自旋锁–>重量锁。
对象怎么定位(直接 间接)
平常使用的就是直接指针(OpenJDK)。
A a =new A();
a就是引用变量,它指向了一个A对象,也可以说它引用了一个A对象。我们通过操纵这个a来操作A对象。 此时,变量a的值为它所引用对象的地址。
对象怎么分配?
逃逸分析 (栈上分配)
一个Object占多少字节?
new Object()占16个字节,然后o是oops(普通对象指针Ordinary object pointers),占4个字节。
new Object()也不一定是16个字节。
因为使用了-XX:+UseCompressedClassPointers对 对象头 的class pointer进行了压缩,所以是4个字节,如果取消压缩的话就是8个字节(-XX:-UseCompressedClassPointers),也就没有了自动对齐。
那什么情况下不压缩?
4个字节的寻址是 4G。使用压缩指针的话,堆内存超过4G的话,已经访问不到堆内存中的所有对象了。此时压缩自动不起作用。
百度
美团
顺丰