问题1 新建对象的过程

  1. 申请空间,此时成员变量赋初始值
  2. 调用构造方法,给成员变量赋值
  3. 关联引用

问题2 DCL和volatile的关系

  • DCL全程Double Check Lock指的是单例的懒汉模式双重非空检测
  • cpu在执行指令时会发生指令重排序,谁快就执行谁
  • volatile通过写操作加内存屏障,禁止指令重排

问题3 对象的结构

对象结构 含义 32位大小 64位大小 64位开启压缩
MarkWord 8字节 4字节 8 8
classpointer对象指针 指向对象类型 4 8 4
数组长度 数组 4 8 4
instance data 实体数据        
padding 对齐 补齐为8的整数倍      

问题4 MarkWord的结构

  1. 对象hashcode ,简单理解为对象的内存地址的整型值
  2. gc分代信息,4位,所以gc最大年龄为15,注意CMS默认最大年龄为6
  3. 锁信息,有如下锁信息:锁标志位、是否偏向锁、持有偏向锁的threadid、epoch偏向时间戳

new Object()发生了什么?

问题5 对象的定位

  1. 句柄池(GC时对象指针不变)
  2. 直接定位

问题6 对象的地址分配

new Object()发生了什么?

  • 优先看栈里能不能放
  • 是否大到了survivor区内存的50%,直接进入老年代
  • 是否ThreadLocalAnnotationBuffer,进入Eden区

问题7 对象的大小

  • 16字节+栈对象引用4字节=20字节

 

相关文章: