虚拟机字节码执行引擎

来源:互联网 发布:linux sleep usleep 编辑:程序博客网 时间:2024/05/18 19:19
  • Java执行引擎的过程为:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。
  • 栈帧是支持虚拟机方法调用与执行的数据结构,栈帧存储了方法的局部变量表,操作数栈,动态连接,方法返回地址等信息。每一个方法的调用都是栈帧在虚拟机栈中入栈和出栈的过程。在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧。
    • 局部变量表
      • 局部变量表是一组变量值存储空间,用于存放方法参数与方法内部定义的局部变量。
      • 在方法执行时,虚拟机使用局部变量表完成参数值到参数变量列表的传递过程。
      • 类变量在类加载的过程中有两次赋值阶段,准备阶段与初始化阶段;实例变量在对象创建的时候也有两次赋值;但是一个局部变量在定义之后必须赋初始值,不然无法使用。
    • 操作数栈
      • 在方法执行过程中,会有各种字节码指令往操作数栈中进行写入与读取内容。
    • 动态连接
      • Class文件中常量池中有大量符号引用,这些符号引用在类加载时会有一部分在解析阶段转换为直接引用(指向实际的内存地址),称为静态解析;还有一部分在运行期间解析,称为动态连接。
    • 方法返回地址
  • 方法调用:
    • 一切方法调用在Class文件中存储的都是符号引用,而不是方法在实际运行时在内存的入口地址(直接引用)。在类加载阶段,会将其中一部分符号引用转换为直接引用,这种解析能成立的前提是:方法在程序运行之前就有一个可确定的调用版本,并且这个方法在运行期间是不可改变的。
    • 在Java中符合“编译期可知,运行期不变”这个要求的方法主要包括:静态方法,私有方法,实例构造器,父类方法,前者与类型相关联,后者在外部不可访问。
  • 分派:
    • 静态分派
      • 变量的静态类型在编译期可知,而实际类型只有到了运行期才能确定,编译器在编译程序的时候根本不知道变量的实际类型。
      • 虚拟机(准确来说是编译器)在重载的时候是根据参数的静态类型作为判断依据;javac编译器会根据参数的静态类型决定使用哪个版本。
      • 静态分派的典型应用是方法重载
    • 动态分派:
      • 在运行期根据实际类型确定方法执行版本的分派称为动态分派。
      • 动态分派主要应用于方法的重写


0 0
原创粉丝点击