对象的创建过程
1. class loading(到内存中)
2. class linking
3. class initializing
4. 申请对象内存
5. 成员变量赋默认值
6. 调用构造方法
1.成员变量顺序赋初始值
2.执行构造方法语句
对象在内存中的存储布局
普通对象
1.对象头(markword 8个字节,存在了对象的状态,被gc回收次数)
2.classPointer指针(指向class对象)(-XX:+UseCompressedClassPointers为4个字节 不开启为8个字节)
3.实例数据(引用类型:-XX:+UseCommpressedOops 为4个字节 不开启为8个字节)
4.Padding对齐,8的倍数
数组对象
1.对象头(同普通对象)
2.classPointer指针(同上)
3.数组长度:4个字节
4.数组数据
5.对齐 8的倍数
对象头具体包含什么?
1.锁定信息:对象有没有锁定,上面2位字节(锁的标志位)(还有一位是偏向锁其实实际上应该算是三位锁标志位)
2.gc的标记:对象被回收多少次,分代年龄
根据对象状态进行每一位的分配
Object o = new Object在内存中占多少个字节?
class文件load到内存中间通过java的agent做一个中间代理,可以对calss进行操作,此处可以通过agent进行计算。
object的对象:
1.markWord头 8个字节
2.classPointer:正常来说是8个字节(但是这里还要看+UseCompressedClassPointers是否开启,如果开启则压缩为4个字节)
3.此时没有数据所以数据位置没有字节
4.对齐4个字节
所以得出结论new Object在内存中占16个字节
对象怎么定位?
当B b = new B(),此时b是怎么找到B这个对象的呢?
1.句柄池(间接指针,b指向两个指针,一个指向真正的对象,一个指向B.Class)
2.直接指针(一个指针直接指向真正的对象,然后这个对象里面有一个指针指向B.Class)(HotSpot使用的是这种方式)