zoukankan      html  css  js  c++  java
  • jvm学习笔记之对象详解

    一、对象的组成

          

        对象头(Header):

              运行时数据:存储对象运行时的数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据官方成为“Mark Word”,它的长度在32位和64位的虚拟机中分别是32bit和64bit。32bit的HotSpot虚拟机中,当对象未被锁定时的组成如下表:

                      

              类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例

        实例数据:对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容

        对齐填充:这部分不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,

              也就是说对象必须是8字节的整数倍,因此当实例数据不是8字节的倍数的时候就需要占位符来填充

    二、对象的创建

          1、虚拟机接收到new指令

          2、检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且这个类是否已经被加载、解析和初始化过,如果没有则先执行类的加载过程

          3、虚拟机为新生对象分配内存空间

          4、将对象中的实例数据都初始化为零值

          5、设置对象的header部分的数据

          6、设置对象的实例数据

    三、对象的访问

        在java程序总使用对象需要通过栈上的reference数据来操作堆上的对象。由于reference类型在java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用通过

      何种方式去定位、访问堆中的对象的具体位置,所以对象访问方式是取决于虚拟机的实现的。目前主流的访问方式有使用句柄和直接指针两种。

      使用句柄方式:   

        使用句柄访问方式的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(GC操作时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而

     reference本身不需要修改。

            

       直接指针访问方式:     

        使用直接指针方式访问的最大好处是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此这类开销积少成多后也是一项非常可观的的执

       行成本

              

         

  • 相关阅读:
    各个基础学习模型超参数调节
    集成学习算法模板
    数据分析关键代码汇总
    数据预处理以及探索性分析(EDA)
    python pandas相关知识点(练习)
    错误 1 未能找到类型或命名空间名称“”, 引入DLL文件出现提示文件不存在问题
    TCPIP学习笔记
    Aforge.net识别简易数字验证码问题
    访问家庭路由器下的主机-路由设置
    python--8、socket网络编程
  • 原文地址:https://www.cnblogs.com/gulang-jx/p/7641371.html
Copyright © 2011-2022 走看看