男人都喜欢什么样的女人| 脚为什么会臭| 夏天梦见下雪是什么意思| 糖耐是什么| 妨夫痣是什么意思| 贫血吃什么水果好| 什么症状吃保心丸| 榴莲吃多了有什么坏处| 非诚勿扰是什么意思| hg是什么意思| 吃木瓜有什么作用| 肝火旺盛吃什么食物| 什么虫子咬了会起水泡| 充饥是什么意思| 宁字五行属什么的| 早上起来后背疼是什么原因| 锌过量会引发什么症状| 吃什么可以增加免疫力| 肝功能四项检查什么| 闪光感是什么感觉| 怀疑心梗做什么检查| 大拇指发麻是什么原因| 炭疽是什么病| 什么食物含钾高| 印堂跳动是什么预兆| 醋精是什么| 肛门里面有个肉疙瘩是什么| 手术后拆线挂什么科| 肿瘤标志物是什么意思| 小腿肌肉痛什么原因| 红花跟藏红花有什么区别| 弢是什么意思| 蓝莓对身体有什么好处| 擦伤用什么药好得快| 人瘦肚子大是什么原因| 吃芒果有什么坏处| 爱放屁是什么原因| 女生吃什么能淡化胡子| 话梅泡水喝有什么好处和坏处| 什么叫肾病综合征| 脚气是什么菌| 父亲节什么时候| 一个胸大一个胸小是什么原因| 减肥吃什么玉米| 一带一路指的是什么| 什么风什么月| 镀18k金是什么意思| 气场是什么意思| 什么食物不能一起吃| 紫苏有什么作用与功效| 前列腺素是什么| 吃黄芪有什么好处| lively是什么意思| 狗不能吃什么食物| 女人十个簸箕是什么命| 站街女是什么意思| 碧玺五行属什么| 高铁服务员叫什么| 什么血型最好| 什么草药能治痔疮| 山药跟淮山有什么区别| 什么入什么出| tga是什么意思| 抗体高是什么意思| 热痱子是什么原因引起的| 硫酸镁是什么| 为什么会出现幻觉| 仰望是什么意思| 11月26是什么星座| 九价是什么| 冲浪是什么意思| 成是什么生肖| 笑面虎比喻什么样的人| 四大美女是什么生肖| bae什么意思| 军士长是什么级别| 中国最厉害的武器是什么| 吃什么可以补黄体酮| 洋葱不能和什么一起吃| 隔的右边念什么| 孩子高烧不退是什么原因| 甲沟炎是什么样子的| 西安有什么区| 艾灸灸出水泡是什么情况| 什么时候夏至| 卢沟桥事变又称什么| 甲状腺查什么| 人为什么会得甲母痣| 吃什么补钙快| 什么茶对胃好| 海龟汤什么意思| 维生素b2起什么作用| 上善若水什么意思| 什么花没有叶子| 晚上十一点是什么时辰| 脱肛是什么意思| 吃卡培他滨禁止吃什么| 胎儿双顶径偏大是什么原因| 丙氨酸氨基转移酶高是什么意思| 什么样的情况下会怀孕| 头上长痣代表什么| 牵牛花是什么颜色| 土豆粉是什么做的| 万人迷是什么意思| 布病什么症状| 尿酸高能吃什么| 牡丹什么时候开放| 际遇是什么意思| 激素是什么意思| 油价什么时候上涨| 酝酿是什么意思| 外阴病变有什么症状| 白带黄用什么药| 颈管细胞有是什么意思| 两特两重指的是什么| 狮子座是什么性格| 白细胞低吃什么好| 二郎腿为什么叫二郎腿| 风疹吃什么药| mp是什么意思| 放我一个人生活是什么歌| 新生儿眼屎多是什么原因| 当兵有什么好处| 劲仔小鱼是什么鱼做的| 孕妇鼻子出血是什么原因| 觊觎什么意思| 遗尿是什么症状| 红豆吃多了有什么坏处| 合肥有什么好玩的地方| 咳嗽雾化用什么药| 什么是零和博弈| 口腔溃疡吃什么药| 喉咙突然哑了什么原因| dan是什么意思| 耳聋吃什么药| 7月22日什么星座| 月经黑红色是什么原因| 女装什么牌子好| 脚后跟长痣有什么寓意| 1991年什么命| 真正的爱情是什么| cp是什么| 丁香泡水喝有什么功效和作用| 着凉了吃什么药| 学美容要学些什么| 肥什么拱门成语| 叫什么名字好听| 低氧血症是什么意思| 羊传染人的病叫什么名| 月什么意思| 俄罗斯信仰什么教| 梦见青蛙是什么意思| 小孩口臭吃什么药| 倒嗓是什么意思| 苓是什么意思| 吃什么水果好| 活性炭是什么东西| 女性尿酸高有什么症状表现| 干碟是什么| 绿色衣服搭配什么颜色的裤子| 八0年属什么生肖| 给女生送礼物送什么好| 水清则无鱼什么意思| otc是什么药| 为什么会心悸| 乙肝表面抗原携带者什么意思| 枸杞子泡茶喝有什么好处| 什么是天眼| 什么地| 鸭子喜欢吃什么| 胰岛素过高会导致什么| 超字五行属什么| 12月28日什么星座| 术后血压低什么原因| 属鸡的守护神是什么菩萨| n什么意思| 人为什么要呼吸| 枯木逢春是什么生肖| 当我们谈论爱情时我们在谈论什么| 瓶颈期什么意思| 南柯一梦是什么意思| 咖啡色是什么颜色| 梦到拉粑粑是什么意思| 看心理医生挂什么科| 放屁臭鸡蛋味什么原因| 挫伤用什么药| 基因检测是什么| 六合是什么意思| 什么病不能吃豌豆| 头皮结痂抠掉又结痂是什么病| 粉尘螨是什么| 心什么胆什么| 气胸叩诊呈什么音| 桑葚泡水喝有什么功效| 什么原因导致脾虚| 人品好是什么意思| 什么品牌的冰箱好| 吃螃蟹不能喝什么饮料| 凤尾鱼为什么突然就死| ct是什么单位| rt是什么单位| 正常龟头什么样子| 嗳气是什么意思| 低血压吃什么药效果好| 家财万贯是什么动物| 进德勤一般要什么学历| 处女是什么意思| 希爱力是什么药| 店小二是什么意思| 英语八级是什么水平| 做梦捡到钱是什么预兆| 女性分泌物少是什么原因| 舌钉有什么用| 什么病不能吃玉米| 有机奶粉是什么意思| 荨麻疹是什么原因引起的| 64岁属什么| 椰子水是什么味道| 身体湿热吃什么中成药| 什么叫人均可支配收入| 焱字五行属什么| 牙齿发麻是什么原因| 宫颈糜烂用什么药好| 吉祥三宝是什么意思| 截胡什么意思| unny是什么牌子| 舒化奶适合什么人喝| hp感染是什么病| 米粉用什么做的| 6月是什么月| 一什么椅子| npv是什么病毒| dha什么时间段吃最好| abcd是什么意思| 花洒不出水什么原因| 空鼻症是什么症状| 奋不顾身的顾是什么意思| fsh是什么| 赘是什么意思| 淋巴细胞数偏高是什么意思| 肺泡是什么| AMI是什么病| 对象是什么意思| 如初是什么意思| 中医的望闻问切是什么意思| 三个火读什么| 大什么针| 什么花是蓝色的| 一笑了之是什么意思| 脸部痤疮用什么药| 拉水吃什么药| 直肠指检能检查出什么| 80年属什么生肖| 仔仔是什么意思| 什么病不能吃核桃| 经常感冒发烧是什么原因| 51年属什么生肖| 洁颜油是干什么用的| 西洋参吃多了有什么副作用| 5月17日是什么星座| 运是什么结构| 材料化学属于什么类| 荆芥不能和什么一起吃| 脚热是什么原因| 百度

a+b=c,处理器一步搞定,Java虚拟机为啥要四步?

基于栈的运行方式
Java虚拟机的执行过程基于字节码指令,可以将其视为对操作系统的一种抽象模拟。Java虚拟机具有自己的指令集和运行环境,包括堆(Heap)、栈(Stack)、方法区(Method Area)等。因此,Java虚拟机的指令操作流程与处理器的指令操作流程有许多相似之处,主要包括取指令、解码指令、执行指令以及更新计算等步骤。
Java虚拟机的指令集架构(Instruction Set Architecture,ISA)主要有两种实现方式:基于栈和基于寄存器。基于寄存器的指令集由于指令直接在寄存器中执行,因此执行效率较高。然而,由于寄存器是由硬件直接提供的,因此其数量和性能受到硬件的限制。
相比之下,基于栈的指令集的优点在于其高度的可移植性和相对容易的实现方式。寄存器的分配和管理是基于寄存器的指令集实现的一个主要难点。然而,基于栈的指令集的缺点是其执行速度相对较慢,这主要有两个原因:
1)基于栈的指令集需要维护出栈和入栈操作,这需要更多的指令,从而间接降低了执行效率。
2)基于栈的指令集的操作是对内存的访问,相比于处理器,内存的访问速度较慢。以下代码为例,来看两种指令集架构的差异:

int a = 1
int b = 2
int c = a + b

编译出来基于寄存器的指令:
add ax bx // AX寄存器的值为1,BX寄存器的值为2,将结果放入AX
编译出来基于栈的指令:

1 iload_0	// 操作数栈读取局部变量的第1个slot
2 iload_1	// 操作数栈读取局部变量的第2个slot
3 iadd	 // 将栈顶的两个slot相加
4 istore_2 // 保存到局部变量中第3个slot

栈架构的指令运算时是与操作数栈交互,即使是数据传递这样的简单操作。这样的好处就是可以忽视具体的物理架构。默认操作数存放在操作数栈上,运算后结果存放在栈顶,指令无需显式指定操作数的来源和去向。因此栈架构指令集的代码紧凑,一般都是一个或者两个字节,但所需的指令数量会比寄存器架构多。
image

栈的运行时

在Java虚拟机中,栈帧(Stack Frame)是一个关键的数据结构,用于支持方法的执行和方法之间的调用。每个栈帧由多个重要部分构成,包括局部变量表(Local Variable Table)、操作数栈(Operand Stack)、动态链接信息(Dynamic Linking)和方法返回地址(Return Address)。
局部变量表用于存储方法的参数以及方法内定义的局部变量。操作数栈则用于保存临时数据,特别是在执行算术运算或表达式时的中间计算结果。动态链接信息用于在方法调用过程中进行动态链接,这一机制是Java实现多态性(Polymorphism)的重要保障。方法返回地址则记录了方法执行完毕后,程序需要返回到的代码位置。
当方法被调用时,Java虚拟机会为该方法分配一个新的栈帧,并将其推入当前线程的栈顶。在方法执行过程中,虚拟机会根据字节码指令对操作数栈和局部变量表进行一系列操作,包括数据加载、存储、算术运算以及类型转换等。
当方法执行完成后,无论是正常退出还是由于未捕获的异常终止,Java虚拟机会将当前栈帧弹出,并将控制权转交给上一个栈帧,具体来说,是转交给方法返回地址所指定的位置。这个过程会持续进行,直到所有的栈帧都被弹出,标志着Java程序的执行结束。
image

操作数栈(Operand Stack),也被称为表达式栈(Expression Stack),是Java虚拟机执行计算的核心工作区域。它的深度是在编译期间通过代码分析计算出来的,并记录在方法的Code属性中。
操作数栈主要负责存储指令执行过程中的中间结果。几乎所有的字节码指令都会与操作数栈进行交互。例如,iadd 指令会从操作数栈顶弹出两个整数,相加后将结果压回操作数栈。这些中间结果可以是各种Java数据类型,包括基本类型(如 int, float, long, double)和对象引用(reference)。
此外,操作数栈还承担着在方法调用和返回过程中参数和返回值的传递任务。当方法被调用时,调用者方法计算出传递给被调用方法的参数值,并将这些参数值依次压入调用者自身的操作数栈。方法调用指令(如 invokevirtual, invokestatic)会消耗这些参数值,并将它们传递给被调用方法。在被调用方法的新栈帧中,这些参数值通常会从调用者的操作数栈转移到被调用方法栈帧的局部变量表中;当方法执行完毕并返回时,被调用方法将其计算得到的返回值(如果有)压入其自身的操作数栈顶。返回指令(如 ireturn, areturn)会将被调用方法栈帧的这个返回值弹出,并压入调用者方法的操作数栈顶,供调用者后续使用。
以下是一个简单的Java方法,以及对应的字节码指令,展示了操作数栈的使用:

public int add(int a, int b) {
    return a + b;
}

对应的字节码指令(使用javap -c命令查看):

public int add(int, int);
   Code:
      0: iload_1       // 将局部变量表索引1处的值(即参数a)压入操作数栈
      1: iload_2       // 将局部变量表索引2处的值(即参数b)压入操作数栈
      2: iadd          // 从操作数栈弹出两个int值,相加后将结果压入操作数栈
      3: ireturn       // 从操作数栈弹出顶部int值,作为方法的返回值

在上述字节码指令中,iload_1和iload_2指令将局部变量表中的值压入操作数栈,iadd指令从操作数栈弹出两个值进行相加操作,并将结果压回操作数栈,最后ireturn指令从操作数栈弹出顶部值作为方法的返回值。

image

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!!!

posted on 2025-08-04 10:46  poemyang  阅读(244)  评论(0)    收藏  举报

导航

龙眼和桂圆有什么区别 什么是二代身份证 七年是什么婚 北极熊为什么不怕冷 男人时间短什么原因
伤口止血用什么药 肚子疼是什么原因引起的 菜瓜是什么瓜 喝酒精的后果是什么 真菌感染用什么药最好
高嘌呤是什么意思 什么是碳足迹 千什么一发 坐月子吃什么下奶最快最多最有效 心绞痛是什么感觉
罗汉果泡水有什么好处 县法院院长是什么级别 肌肉劳损用什么药 什么的流着 帕金森病是什么病
地铁是什么hcv9jop1ns9r.cn 核桃壳有什么用hcv9jop5ns3r.cn 蚂蚱和蝗虫有什么区别hcv7jop5ns1r.cn 属猪的贵人属相是什么xinmaowt.com 背道而驰是什么意思adwl56.com
三个羊念什么hcv9jop5ns0r.cn 腰椎间盘突出适合什么运动hcv7jop6ns4r.cn 来例假肚子疼吃什么药hcv7jop4ns6r.cn 紧急避孕药什么时候吃有效hcv8jop6ns1r.cn 柴鸡是什么鸡hcv9jop1ns3r.cn
协警是什么编制hcv9jop2ns5r.cn 什么天空填动词hcv8jop4ns6r.cn 活碱是什么hcv8jop8ns6r.cn 卟啉症是什么病hcv8jop3ns7r.cn 66什么意思hcv9jop5ns9r.cn
口我是什么意思cj623037.com 蟑螂什么样子hcv8jop2ns7r.cn 十一月十七日是什么星座travellingsim.com 陈醋泡花生米有什么功效qingzhougame.com 杂合突变型是什么意思wuhaiwuya.com
百度