JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,都需要const
先到操作数堆栈,然后store
再到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作?
具有直接操作数的指令集必须对每个指令中的操作数进行编码。相反,对于使用操作数堆栈的指令集,操作数是隐式的。
当查看小的琐碎运算(例如将常量加载到变量中)时,隐式参数的优势并不明显。本示例将“操作码,常量,操作码,变量索引”序列与“操作码,常量,变量索引”进行比较,因此看起来直接寻址更简单,更紧凑。
但是让我们看一下 return Math.sqrt(a * a + b * b);
假设变量索引从零开始,字节码看起来像
0: dload_0
1: dload_0
2: dmul
3: dload_2
4: dload_2
5: dmul
6: dadd
7: invokestatic #2 // Method java/lang/Math.sqrt:(D)D
10: dreturn
11 bytes total
对于直接寻址的体系结构,我们需要类似
dmul a,a → tmp1
dmul b,b → tmp2
dadd tmp1,tmp2 → tmp1
invokestatic #2 tmp1 → tmp1
dreturn tmp1
我们必须用索引替换名称。
尽管此序列由较少的指令组成,但是每个指令必须编码其操作数。当我们希望能够处理256个局部变量时,每个操作数需要一个字节,因此每个算术指令需要三个字节加操作码,调用需要两个加操作码和方法地址,而返回则需要一个加操作码。因此,对于字节边界处的指令,此序列需要19个字节,大大超过等效的Java字节码,同时被限制为256个局部变量,而该字节码最多支持65536个局部变量。
这证明了操作数堆栈概念的另一优点。Java字节码允许不同,优化的指令,例如用于装载一个整常数结合有iconst_n
,bipush
,sipush
,和ldc
用于存储它到一个变量有istore_n
,istore n
,和wide istore n
。当直接变量寻址的指令集应支持各种常数和变量数量,但仍支持紧凑型指令时,每种组合都需要使用不同的指令。同样,这将需要所有算术指令的多个版本。
除了使用三个操作数形式,还可以使用两个操作数形式,其中一个源变量也指示目标变量。这样可以得到更紧凑的指令,但是如果此后仍需要操作数的值,则需要附加的传输指令。操作数堆栈形式仍然更紧凑。
请记住,这仅描述操作。在执行代码时,不需要执行环境严格遵循此逻辑。因此,除了最简单的解释器之外,所有JVM实现都在执行之前将其转换为其他形式,因此原始存储形式对实际执行性能无关紧要。它仅影响空间需求和加载时间,这两者都受益于更紧凑的表示形式。这尤其适用于通过可能很慢的网络连接传输的代码,这是Java最初设计的用例之一。
问题内容: 我正在阅读有关JVM体系结构的信息。今天,我了解了操作数堆栈的概念。根据一篇文章: 在字节码指令执行期间使用操作数堆栈,其方式与在本机CPU中使用通用寄存器的方式类似。 我不明白:操作数堆栈到底是什么,以及它在jvm中如何工作? 问题答案: 这是各种单个字节码操作如何获取其输入以及它们如何提供其输出的方式。 例如,考虑将两个s相加的运算。要使用它,您将两个值压入堆栈,然后使用它: 现在
Runtime data Area 什么是操作数栈? 与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。 存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为
使用在Play Framework(Java版本)应用程序中调用SOAP服务的ws-security部分时,为了支持这些构件,导致了这种混乱: 所使用的工件包括: 其中,是: 通过搜索此部分: (这意味着降级包),问题将得到解决,服务调用将成功工作。 现在我的问题是:错误在哪里?在JVM、WSS4J或游戏框架中? 播放框架版本:2.5.8 java版本“1.8.0_121” Java(TM)SE运
我来自C/C++背景,在这里一个进程内存分为: null 我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?并且整个JVM的实际内存驻留在堆上(这里指的是堆的C++概念)?
6、堆栈操作指令(StackOperation Instruction) 堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。 1)、进栈操作 、PUSH(Push Word or Doublewordonto Stack) 指令格式:PUSH Reg/Mem PUSH Imm;80286+ 一个字进栈,系统自动完成两步操作:SP
本文向大家介绍Docker堆栈的管理操作详解,包括了Docker堆栈的管理操作详解的使用技巧和注意事项,需要的朋友参考一下 本文详细讲述了Docker堆栈的管理操作。分享给大家供大家参考,具体如下: 在Docker中,镜像是一个轻量级的,独立的可执行程序包,包含运行一个软件所需的所有东西,包括代码、运行环境、库、环境变量和配置文件。容器是镜像的运行实例,默认情况下,它与主机环境完全隔离,只有在配置