当前位置: 首页 > news >正文

wordpress中国网站排名互联网新项目在哪里找

wordpress中国网站排名,互联网新项目在哪里找,做网站后台要学什么,衡阳网站建设技术外包虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一#xff0c;它是由软件自行实现的#xff0c;能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现#xff0c;执行引…虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一它是由软件自行实现的能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现执行引擎可能会有解释执行和编译执行或者两种兼备但是所有执行引擎的输入输出都是一样的输入的是字节码二进制流输出的是执行结果 二、运行时栈帧结构 Java虚拟机以方法为最基本的执行单元栈帧则是虚拟机用于方法调用和方法执行背后的数据结构它是虚拟机运行时数据区中的虚拟机栈的基本元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。一个栈帧需要分配多少内存具体虚拟机实现的栈内存布局形式。 以Java程序的角度来看同一时刻同一线程里面在调用堆栈的所有方法都处于执行状态。以执行引擎的角度来看只有位于栈顶的栈帧才是生效的其被称为当前栈帧对应的方法被称为当前方法。栈帧结构如图8-1所示。 一局部变量表 局部变量表用于存放方法参数和方法内的局部变量在Java程序被编译为class文件时就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。 局部变量表的容量以变量槽为最小单位变量槽的大小并没有明确规定只是说每个变量槽都需要可以存放boolean、 byte、char、short、int、float、reference或returnAddress类型的变量这8种数据类型最大是32位。所以变量槽需要大于32位但不一定是32位。 对于提到的8种数据类型前6种和Java中的差不多reference表示对一个对象实例的引用returnAddress指向了一条字节码指令的地址这种类型已经很少见了。像long和double这样64位的数据类型Java虚拟机会以高位对齐的方法为其分配两个连续的变量槽空间。 Java虚拟机通过索引定位的方式使用局部变量表若是32位的数据类型索引N就对应着第N个变量槽若是64位的数据类型索引N就对应着第N和第N1个变量槽。对于两个相邻的共同存放64位数据类型变量的变量槽不允许单独访问某一个变量槽。 当一个方法被调用时就会使用局部变量表来完成参数值到参数变量列表的传递过程。 为了节省栈帧所占用的内存空间局部变量表中的变量槽是可以重用的。若当前字节码PC计数器已经超过了方法体内的某个变量计数范围那么这个变量的变量槽就可以被其它变量重用。但有时候变量槽的复用会影响到垃圾收集。 代码8-1和8-2中的placeholder占用的空间都没有被回收只有代码8-3的palceholder占用的空间被回收了。这是因为判断是否被回收的根本原因是局部变量表中的变量槽是否还存在对placeholder的引用。8-1是因为执行System.gc的时候还在placeholder的作用域中8-2是因为placeholder原本所占用的变量槽还没有被其它变量复用。8-3中已经不在placeholder的作用域中了并且int a0复用了placeholder原本占用的变量槽。在这里如果手动给placeholder赋null值也是一样的但是赋null值在经过即使编译优化后是会被当作无效操作消除掉的。 局部变量不像前面提到的类变量存在准备阶段前文的类变量会在准备阶段被赋一个系统初始值然后在初始化阶段被赋一个定义的初始值所以即使代码中没有给类变量赋初始值也是可以的。但是局部变量如果定义了但没赋初始值它就是完全不能使用的。 二操作数栈 操作数栈和局部变量表类似也是在编译期间最大深度就写入了Code属性的max_stacks数据项之中。32位数据类型占一个栈帧64位数据类型占两个栈帧。 在方法执行时是先把运算涉及的操作数压入到栈中然后调用运算指令使对应的数出栈进行运算再把结果入栈。栈中的元素类型与字节码指令指令需要严格匹配如iadd指令栈顶的两个元素必须是两个int类型的。 在概念模型中两个不同栈帧作为不同虚拟机栈的元素是完全独立的但是大部分虚拟机实现中栈帧是有重叠部分的。如图所示。 三动态连接 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用持有这个引用是为了支持方法调用过程中的动态连接。在类加载阶段或者第一次使用符号引用被转化为直接引用这是静态解析。在运行时符号引用转化为直接引用这是动态连接。 四方法返回地址 当一个方法开始执行后只有两种方式退出这个方法。第一种就是遇到一个方法返回的字节码指令这种方式叫做”正常调用完成”。第二种就是遇到异常并且还没有处理好遇到的异常这种方式叫做”异常调用完成”。 无论采用哪种退出方式方法退出后都必须回到最初方法被调用的位置。 方法退出过程等同于把当前栈帧出栈因此退出时可能执行的操作有恢复上层方法的局部变量表和操作数栈把返回值压入调用者的操作数栈中调整PC计数器的值以指向后一条指令。 五附加信息 在讨论概念时一般会把动态连接、方法返回地址与其他附加信息全部归为一类称为栈帧信息。 三、方法调用 方法调用并不涉及到具体的执行只是确定方法的版本(调用哪个方法)。一切方法调用在class文件中只是符号引用而不是实际运行时内存布局中的入口地址(直接引用)。这使得某些类在类加载期间甚至是运行期间才能确定目标方法的直接引用。 一解析 在类加载阶段就有一部分符号引用转化为直接引用这个前提是方法在程序运行前就有一个确定的版本。这类方法的调用被称为解析。 在Java中符合“编译器可知运行期不可变”的主要有静态方法和私有方法。 调用不同类型的方法字节码指令集中有不同的指令 invokestatic:调用静态方法 invokespecial:调用实例构造器方法、父类方法和私有方法 invokevirtual:调用虚方法 invokeinterface:调用接口方法 invokedynamic:先动态解析出调用点限定符所引用的方法再执行该方法。 只要能被invokestatic和invokespecial调用的方法都可在解析阶段确定唯一版本。有静态方法、私有方法、类的构造方法、父类方法四种还有被final修饰的方法不过被final修饰的方法被invokevirtual调用。这五种方法在类加载阶段就把符号引用替换为直接引用它们被称为“非虚方法”其它的方法被称为“虚方法”。 如图静态方法sayHello只属于该类型没有任何方式覆盖或者隐藏这个方法。 用javap指令查看字节码发现的确是通过invokestatic方法调用的sayHello()方法 二分派 Java是一门面向对象的程序语言它具备面向对象的3个基本特征封装、继承、多态。本节的分派调用过程将会揭多态的一些基本体现。 1.静态分派 分派这个词本来就具有动态性在书中英文是“Method Overload Resolution”即应该属于8.2中的解析。不过很多中文资料都称这种行为为静态分派。 运行结果为 hello,guy! hello,guy! 对于变量man和woman来说Human是静态类型而对应的Man和Woman是运行时类型(实际类型)。变量最终的静态类型在编译期可知而实际类型在运行期才可以确定。 虚拟机在重载时是通过参数的静态类型作为依据的在编译期间就根据参数的静态类型选择了调用的方法。静态分派最典型的就是重载这发生在编译期间所以实际上静态分派动作并不是由虚拟机执行的。 重载方法匹配并不一定就是完全对应的也会自动转换这个转换是有优先级的。比如字符’a’它的重载匹配的方法是按照参数类型为charintlongfloatdouble的顺序转型进行匹配。如果都没有就会进行自动装箱匹配到Character。把Character类型的参数再注释掉会匹配Character实现的接口Serializable和 Comparable。再没有也有可能会匹配到父类Object。 2.动态分派 静态分派是和重载有着很大的关系动态分派是和重写有着很大的关系。 运行结果是man say hello woman say hello woman say hello 代码中的两个变量静态类型都是Human实际类型是Man和Woman变量man的实际类型在之后还变成了Woman。 根据字节码可以看出两个调用无论指令还是参数都一样但是最终执行的目标方法不同那么就是invokevirtual有着一些判断。 invokevirtual的解析过程大致为下面几步 1找到操作数栈顶的第一个元素所指向的对象的实际类型记作C。 2如果在类型C中找到与常量中的描述符和简单名称都相符的方法则进行访问权限校验如果通过则返回这个方法的直接引用查找过程结束不通过则返回java.lang.IllegalAccessError异常。 3否则按照继承关系从下往上依次对C的各个父类进行第二步的搜索和验证过程。 4如果始终没有找到合适的方法则抛出java.lang.AbstractMethodError异常。 所以说invokevirtual还会根据方法接收者的实际类型去选择方法版本。这个过程就是Java重写的本质这种分派过程就是动态分派。 多态性的根源在于虚方法调用invokevirtual所以字段是没有多态的。当子类有与父类同名字段虽然内存中两个字段都存在但实际上子类会覆盖父类的字段。 结果分析首先子类隐式调用了父类的构造方法父类构造方法调用的showMeTheMoney是虚方法虚方法看的是实际类型所以其实是Son::showMeTheMoney这个时候Son的money字段还为0输出了第一行。然后就到了Son的构造方法的调用输出了第二行。主方法中访问money字段看的是静态类型所以是Father中的2。 3.单分派与多分派 方法的接收者与方法的参数统称为方法的宗量根据宗量的多少可以把方法分为单分派和多分派。 编译阶段编译器选择的过程也就是静态分派的过程。这时候选择目标的根据1、静态类型是Father还是Son 2、参数类型是360还是QQ。这根据了两个宗量进行选择所以静态分派过程是多分派。 运行阶段虚拟机的选择也就是动态分派的过程。在执行“son.hardChoice(new QQ())”使已经确定参数类型是QQ了所以唯一影响选择的就是接收者的实际类型是Father还是Son。只根据了一个宗量进行选择所以动态分派过程是单分派。 所以Java语言是一门静态多分派动态单分派的语言。 4.虚拟机动态分派的实现 动态分派是执行非常频繁的动作所以真正运行时不会如此频繁的去搜索元数据而是会建立一个虚方法表。 虚方法表中存放着各个方法的实际入口地址如果某个方法在子类中没有被重写那么它在子类和父类的地址是一样的都指向父类的实现入口。如图8-3Son重写了Father的全部方法所以没有指向Father的箭头但是他们俩都没有重写Object的方法所以都有指向Object的箭头。
http://www.w-s-a.com/news/546375/

相关文章:

  • 网站开发人员保密做最优秀的自己演讲视频网站
  • 一般做网站要多少钱怎样选择高性价比的建站公司
  • 免费私人网站建设软件高端网站设计平台高端网站设计企业
  • 响应式网站建设的应用场景怎么申请电商平台
  • 怎么做垂直自营网站游戏咨询网站建设目标是什么
  • 建设网站需要给钱吗建立网站三大基础
  • 金融公司网站 htmlwordpress 防火墙
  • 重庆智能建站模板网站投票系统 js
  • 网站维护的内容和步骤网站做什么内容
  • 万网虚拟主机建网站wordpress协调世界时
  • 微网站建设方式应用大全网站
  • 网站速度测速织梦模板下载
  • 环保网站建设公司排名汉阴网站建设
  • 自己做网站的二维码wordpress用户权限在哪改
  • 网站使用说明书网站建设公司的介绍
  • 推广型网站免费建设网站防盗链设置
  • 建设银行网站查开户行网站反链暴增怎么回事
  • centos7做网站软件实施工程师工资一般多少
  • 专业房产网站建设深圳建设交易集团
  • 政务网站建设标准项目经理接到网站开发怎么开展
  • 网站框架设计好后怎么做网站广告销售怎们做
  • asp技校网站保定八大平台公司
  • wordpress网站前端优化网站备案批量查询
  • 北京企业做网站杭州seo中心
  • 护肤品网站建设前的行业分析wordpress电子书模板
  • 做网站怎么销售.net开发网站怎么样
  • 蚌埠网站优化网站换空间wordpress
  • 微网站开发框架公司企业logo
  • 大淘客官网做的网站打不开网站建设完成
  • 婚纱摄影网站模板让别人做网站怎样才安全