美文网首页
Java对象

Java对象

作者: 井底之蛙的仰望 | 来源:发表于2020-07-26 23:24 被阅读0次

对象的创建

  • class loading
  • class linking( verification, preparation, resolution)
  • class initialization
  • 申请对象内存空间
  • 成员对象赋初始值(内存填充0)
  • 调用构造方法
    • 成员变量按顺序赋予初值
    • 执行构造方法

对象组成及大小(64位虚拟机)

普通对象

  1. 对象头:markword 占8个字节

    • 记录对象自身运行时的数据,如:HashCode、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、GC分代年龄等。
    • GC分代年龄占4个bit,最大15,默认GC年龄加到15时(-XX:MaxTenuringThreshold可调节),JVM会将新生代对象移动到老年区
    • image.png
  2. ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节

  3. 实例数据

    • 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
      Oops: Ordinary Object Pointers
    • 基本类型 boolean,byte,short,int,long,char, float,double
  4. Padding对齐,8的倍数

数组对象

  1. 对象头:markword 占8个字节
  2. ClassPointer指针同上
  3. 数组长度:4字节
  4. 数组数据
  5. Padding对齐,8的倍数

对象访问方式

  • 句柄池 :reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
  • 直接指针:快,相比句柄池节省了一次指针定位的时间开销


    image.png

相关文章

网友评论

      本文标题:Java对象

      本文链接:https://www.haomeiwen.com/subject/yqlnlktx.html