java 虚拟机 字节码,JAVA虚拟机:虚拟机字节码执行引擎

“虚拟机”是一个相对“物理机”的概念,这两种机器都有代码执行能力。

物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的。

虚拟机的执行引擎由自己实现,自行制定指令集与执行引擎的结构体系,并可执行不被硬件直接支持的指令集格式。

在虚拟机规范中,制定了虚拟机字节码执行引擎的概念模型,为各种虚拟机执行引擎的统一外观。

执行引擎在执行java代码时候可能会有解释执行和编译执行两种模式。

输入:字节码  处理:字节码解析 输出:执行结果

虚拟机的方法调用

虚拟机的字节码执行

栈幀:存在于虚拟机栈内存中,用于支持虚拟机进行方法调用和方法执行的数据结构。为虚拟机栈中的栈元素。

存储数据:局部变量表、操作数栈、动态链接和方法返回地址。

方法调用过程即一个栈幀在虚拟机栈里从入栈到出栈的过程。

局部变量表的大小、操作数栈深度,在编译期间已经确定,这些大小、深度写入了方法表的Code属性中,因此一个栈幀需要分配多少内存,不会受到程序运行

期间变量数据的影响,而仅仅取决于具体的虚拟机实现。

一个线程中的方法调用链很长,很多方法都同时处于执行状态,对于执行引擎来说,在活动线程中,只有位于栈顶的栈幀才是有效的,称为当前栈幀,与这个栈幀相关的方法称为当前方法。

执行引擎的所有字节码指令都只针对当前栈幀进行操作。

栈幀概念模型:                           当前线程                                  线程1                     线程2

当前栈幀                               当前栈幀               当前栈幀

局部变量表                           局部变量表            局部变量表

操作数栈                                操作数栈               操作数栈

动态链接                                动态链接               动态链接

方法返回地址                        方法返回地址         方法返回地址

.............                                  .............                .............

栈幀N                                      栈幀N                   栈幀N

............                                   ............                  ............

栈幀2                                         栈幀2                   栈幀2

栈幀1                                         栈幀1                   栈幀1

局部变量表:存放方法参数和方法内部局部变量,容量:在java程序编译为class文件时,就在方法的code属性的max_locals数据项中确定了该方法的所需分配的局部变量表的最大容量。

变量槽(Slot)是局部变量表中最小单位。

操作数栈:后入先出栈,可用户算术运算或调用其他方法时候进行参数传递。

例子:整数加法的字节码指令iadd在运行时候操作数栈中最接近栈顶的两个元素已经存入两个int型的数值,当执行这个指令时,会将这两个int值出栈并相加,然后将相加后的结果入栈。

动态链接:

方法返回地址:即当前栈幀出栈,退出时执行操作:恢复上层方法的局部变量表和操作数栈,把返回值压入调用者栈幀的操作数栈中,调整计数器的值指向后一条指令。

方法调用过程:

方法调用概念:确定被调用方法的版本

解析:所有方法调用中的目标方法在class文件里都有一个常量池中的符号引用,在类记载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析能成立的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可改变的。比如:静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了他们都不可能通过继承或别的方式重写其他版本,因为他们都适合在类加载阶段进行解析。

java虚拟机5条方法调用字节码指令:

1、invokestatic :调用静态方法。

2、invokespecial:调用实例构造方法、私有方法、父类方法。

3、invokevirtual:调用所有的虚方法。

4、invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。

5、invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,以上4条指令,分派逻辑是固化在java虚拟机内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 触发器不能同时 insert or update or delete_MySQL6:触发器

什么是触发器MySQL的触发器(trigger)和存储过程一样,都是嵌入到MySQL中的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作&am…

javabean连接mysql数据库,jsp+javabean 链接 mysql 数据库

JSPJavaBean html一、JavaBean类java首先先澄清 这个三个都是绝对路径 没有相对路径, E://test.txt 和 E:/test.txt 是一个意思 E:\\text.txt 用这样的写法是 \\ 转义了 ‘\’ .linux为何有\\ 的写法 和 / 这样的写法呢 ,由于window 默认的是\\ 这样…

mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

冗余索引和未使用索引的危害随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引。但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上数据…

java第一次课必修实验答案,Java第一次实验报告

北京电子科技学院(BESTI)实验报告课程:Java实验 班级:201352 姓名:池彬宁 学号:20135212成绩: 指导教师:娄佳鹏 实验日期:15.04.14实验密级: 预习程度…

python实现目标识别_Python10行代码实现目标检测

ImageAI可以让程序员和软件开发者只用几行代码,就能轻易地把最先进的计算机视觉技术整合到他们现有的以及新的应用程序里面。用ImageAI实现目标检测,你只需要以下步骤:安装Python安装ImageAI和相关函数库下载目标检测模型文件运行示例代码(只…

在matlab中求协方差,matlab里面的求协方差函数

一:matlab里面关于方差和协方差的几点需要注意的求均值的函数:mean求方差的函数:var标准差:方差:求协方差的函数:cov1 如果a,b是向量,则:cov(a,b)相当于是[D(a),cov(a,b);cov(b,a),D…

python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR-阿里云开发者社区...

1. 资产组合VaR建模方法回顾文章中总结了通过DCC模型估计组合向前一日VaR的方法,整体思路如下:● 通过Garch族模型估计各资产的波动率● 通过DCC模型估计各资产间的相关系数,结合1得到资产组合的协方差矩阵● 在各资产正态性假设的前提下&…

matlab从矩阵中取rp开头文件,matlab trainrp

Af ] train(net, P,T, Pi, Ai,VV ,TV ) 3 [Y, Pf , Af , E, perf ] sim(net, P, Pi, Ai,T ) {tansig,purelin},trainrp BP lr......traingdm、traingda、 traingdx 、 trainrp 、 ...traingdm traingda traingdx trainrp train...{tansig,purelin},trainrp BP 网络的训练函数 训…

手机浏览器网址_「效率集」自定义网址导航高级功能介绍

「效率集」是国内仅有的几家提供了个性自定义导航的网站,功能比hao123强,用户体验优于百度导航首页,且支持聚合搜索,方便用户从不同渠道(网页,微博,微信公众号,知乎,维基…

属于服务器端运行的程序_生信分析云平台产品开发 - 5 生信分析pipeline服务器端运行...

在上文 [生信分析云平台产品开发 - 4 生信分析pipeline的图形化] 讨论了生信分析pipeline的图形化,如何用图形的方式显示生信pipeline,但是pipeline脚本按照变量的形式保存之后,如何运行,在什么环境下运行?是本文要解决…

c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...

MySQL数据库中分组统计的问题首先准备四张表A、B、C、D,--------------------------------A  | B  | C  | Da b | a c | a d | d e1 1 | 1 1 | 1 A | A 12 2 | 1 3 | 2 B | B 23 4 | …

TF卡里删掉文件后内存没变大_原来三星手机是这样清理内存的,难怪用好几年也不卡...

三星手机的耐用性一直都很高,而除了手机本身系统性能做的很好之外,手机的设置也是很人性化的。在三星手机使用了一段时间过后,手机里的内存会越来越大,手机里的垃圾也会越存越多,那么我们应该怎么清理手机中的内存呢&a…

拓扑排序排课系统_视频结构化人脸布控系统

一、平台背景在国家智慧城市的建设中的公共安全,对维稳防控、全城布控、预测预警、综合管理等提出了更高需求,针对这些需求我们作为识别领域的领先者,结合我们的识别技术,更全面、更智能提出了我们视频结构化黑名单布控系统解决方…

php数组转ini文件,php – 将数组转换为.ini文件

为了编写.ini文件,你需要创建自己的函数,因为除了阅读之外,PHP没有提供开箱即用的功能(可以在这里找到:http://php.net/manual/pl/function.parse-ini-file.php).可能将多维数组封装到.ini-syntax兼容字符串的函数示例可能如下所示:function arr2ini(arr…

win10去掉快捷方式小箭头_简单几步,教你怎么去掉win10电脑图标小箭头

Windows通过在桌面图标上增加“小箭头”,来区分它是属于正经的应用程序、文件还是快捷方式。好处能够一目了然的区分桌面显示的内容都是什么。坏处就是对有强迫症、要求统一的用户来说,这个小箭头实在是太碍眼了!如果你属于后者,注…

python整形怎么切片_python 切片操作 slice

列表切片:list [start_index, end_index, step] step可正可负,为正时表示从左往右取,为负时表示从右往左取步长-1:表示从右往左取,开始1,结束3,表示从左往右取,两个互相矛盾&#x…

php实现双向队列详解,PHP实现一个双向队列例子

deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双向队列(双端队列)就像是一个队列,但是你可以在任何一端添加或移除元素。双端队列(de…

CIF进口货物流程图_上海关区对外承包工程货物进口报关公司【清关代理吧】

进口清关:退运/返修/一般贸易/对外承包工程专业、专心、专注提供服务上海港/上海海关:对外承包工程进口清关报关有需要看左边:←←←←←←←进口清关报关要注意哪些问题:(同行禁止抄袭及转载)首先:要找一家靠谱、值得…

月均数据_程序员月均薪多少,2019全国互联网行业程序员就业大数据报告

《2019全国互联网行业程序员就业大数据报告》,该报告针对程序员画像、专业背景、职能供需分布、城市分布特征和薪资优势等方面进行分析。作者:子瑜说IT下面,一起来看看,2019年1月-9月程序员的就业现状。01、程序员基础画像“程序媛…

php json 循环输出html,我要用js从json文件中取值,并输出的html页面,有个问题

json文件有多个 0.json 1.json 2.json 3.json ...现在的情况是js可以挨个读取json文件中的内容,但是每次读取新文件的时候之前的文件内容就没了,我想要加载新json文件内容时,保留之前的读出来的内容求大神!!&#xff0…