jvm 对象探秘

对象的创建:

当虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类是符号引用,并且检验这个符号引用代表的类是否已被加载过。

对象的内存布局

  1. 对象头

    • HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳
    • 类型指针(即对象指向它类元数据的指针)
  2. 实例数据 :各种类型的字段内容

  3. 对齐填充 :没有特定含义,起着占位符的作用

对象的访问定位

  • 使用句柄访问

  • 直接指针访问

使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移到(因为垃圾回收)时只会改变句柄中到对象实例数据的指针,而reference本身不用改变。
使用直接指针访问方式的最大好处是速度快,它节省一次指针定位的时间开销,由于对象的访问在java中十分频繁