ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入理解JVM(四)-执行引擎

2021-07-20 16:02:41  阅读:153  来源: 互联网

标签:Java 虚拟机 局部变量 引擎 深入 引用 JVM 方法 栈帧


        本文章是根据《深入理解Java虚拟机》一书,并参考网上其他文档进行的系统性的和简单容易理解的方式进行的整理。

一、执行引擎

        执行引擎是Java最核心的组成部分之一,具有执行代码的能力,如下图所示:

1、运行时栈帧结构

        栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区虚拟机栈的栈元素。栈帧存储了局部变量表、操作数栈、动态链接、方法返回地址等信息。执行引擎所运行的字节码文件都只对当前栈帧进行操作。栈帧中的局部变量表、操作数栈等的大小已经在编译好的字节码文件(也可以是网络中的字节码信息)中指定好。

        ①局部变量表。一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。最大容量在Class文件的属性中指定。局部变量表的变量需要手动赋初值。

        ②操作数栈。 操作数栈也常被称为操作栈,它是一个后入先出栈,最大容量在Class文件的属性中指定。

        ③动态链接。每个栈帧都包含一个指向运行时常量池的该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。

        ④方法返回地址。当一个方法被执行后,有两种方式退出这个方法,一种是正常完成出口(方法遇到返回指令),一种是异常完成出口(JVM虚拟机内部产生异常)。

        ⑤附加信息。虚拟机规范中没有明确要求的其他供应商自行添加的信息。

2、方法调用

        方法调用不等同于方法的执行,Class文件中存储的都是符号引用(给Java带来更强大的动态扩展能力),需要在类加载期间甚至到运行期间才能确定目标方法的直接引用,所以使得Java的调用过程变得相对复杂。

        ①解析:在编译期将方法的符号引用转变为直接引用,符合”编译器可知,运行期不可变“的要求,符合这个要求的主要有静态方法和私有方法(因为这两类方法不可能通过继承或别的方式写出其他版本),其中静态方法时通用的,而私有方法是私有的。主要是针对非虚方法。补充概念:

                虚方法:能被重写的方法,一般指的是实例方法。

                非虚方法:不能被重写的方法,指的是构造方法、静态方法、私有方法和final修饰的方法。

        ②分派:Java虚拟机确定正确的目标方法的过程。分派与解析不是互斥的动作,而是在不同层次去筛选和确定目标方法的过程。主要是针对虚方法

                静态分派:在代码编译期间通过静态类型(方法参数的接收类型,而不是实际类型)来定位方法执行版本的分派动作。主要体现在方法的重载。需要注意的是,在重载情况下,编译器虽然能确定出方法的重载版本,很多情况下这个重载版本并不是“唯一”的,往往只能确定一个更加适合的版本。如下图,当调用sayHello(‘a’)时,编译器会在下面三个方法中选择一个合适的方法:

                动态分派:主要是体现了重写的特性。大概步骤如下:

                        第一步:找到对象的实际类型;

                        第二步:如果在对象中找到同名的方法并校验访问权限,如果通过则返回这个方法的直接引用,查找过程结束。

                        第三步:如果第二步没找到则去其父类中查找同名的方法和进行权限验证,如果通过则返回方法的直接引用,查找过程结束。

                        第四步:如果没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。

标签:Java,虚拟机,局部变量,引擎,深入,引用,JVM,方法,栈帧
来源: https://blog.csdn.net/Simon111Qiu/article/details/118695348

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有