我浏览JavaEye时间挺久,不过很长时间只潜水,连个账户都是2006年春天才申请。2006年八月初发表了第一个帖子,是回答一个网友关于JVM的问题。JavaEye升级到2.0之后,别的帖子都转过来了,唯独这一篇除外。幸好当初留了个草稿。
原来的问题,是问Inside The Java Virtual Machine一书中一段话是什么意思:
引用
The bytecode streams that represent Java methods are a series of one-byte instructions, called opcodes, each of which may be followed by one or more operands. The operands supply extra data needed by the Java Virtual Machine to execute the opcode instruction. The activity of executing bytecodes, one opcode after another, constitutes a thread of execution inside the Java Virtual Machine. Each thread is awarded its own Java Stack, which is made up of discrete frames. Each method invocation gets its own frame, a section of memory where it stores, among other things, local variables and intermediate results of computation. The part of the frame in which a method stores intermediate results is called the methodís operand stack. An opcode and its (optional) operands may refer to the data stored on the operand stack or in the local variables of the methodís frame. Thus, the virtual machine may use data on the operand stack, in the local variables, or both, in addition to any data stored as operands following an opcode when it executes the opcode.
(这一段我是从第一版的第三章Security,章节Phase One: Internal Checks里摘下来的,在第二版里估计没有什么变动,但章节可能不一样)
这里面有三个关键词:
- Java Stack
- Frame
- Operand stack (注意,这个stack和第一个不是一回事,下面会提到。)
线程是执行一条条机器指令的,文章中The activity of executing bytecodes, one opcode after another, constitutes a thread of execution inside the Java virtual machine 是指这个意思。原网友误解成一个又一个的opcode组成了thread,这不对。一个又一个的opcode不组成thread,而是对一个又一个opcode的执行,组成了thread,
(activity of executing bytecodes)。
Java程序由调用main方法开始,这是第一个方法调用,由main调用另外个方法,这就开始了个新的调用。每一次调用,就生成一个新的frame。
在创建thread的时候,JVM给thread独建一个属于这个thread自己的Java Stack, 然后开始调用main,调用main就建立第一个frame,放在Java Stack里。从main调用另外个方法,生成个新的frame,放在Java Stack最顶上,调用结束,这个最顶上的frame去掉。可以想象java thread在执行时,随着方法调用,Java Stack里面frame增增减减。所以说Java Stack是由一个个frame组成的。
(可以玩玩这个Thread.currentThread().dumpStack(); 就明白了。)
Discrete frames 这里该理解成一个个的frame, 而不是“不连续的frame”。
那么frame里面放的是什么东西呢?翻翻任意一本讲编译器的书,都说里面有这个方法(函数)调用传的参数,返回地址,和局部变量。在jvm里,还有一个叫做operand stack的东东。
我们现在用的计算机,都是寄存器架构的(register machine). JVM 和 .NET Virutal Machine, 都是stack machine. 这两者有什么区别呢?计算一个简单的表达式:1+2,用opcode和operand表达就是add 1, 2 在register machine里面,先把1放在第一个寄存器里面,2放在第二个寄存器里面,运算时从那两个寄存器里取值,结果放在第三个寄存器里面。在jvm里,则是先把1 push到operand stack里,再把2 push 到 operand stack 里,运算时pop 两下把1和2取出来,结果3再push回 operand stack 里面。
运行1+2+3+a, 除了operand stack 之外,还要取局部变量a的值,那段英文的最后一句话指的就是这个。
最后说一句,Java Stack,frame,operand stack,都是内存里面的一块地方。
分享到:
相关推荐
每一个frame空间可以称之为StackFrame。 Method Frame 当调用一个新方法的时候,就会在JVM Stack上分配一个frame空间;当方法退出时,相应的frame空间也会JVM Stack上进行清除掉(出栈操作)。在frame空间当中,有...
《rewolf-jvm-operand-stack-viewer:深入理解Java虚拟机操作数栈》 在Java虚拟机(JVM)的执行引擎中,操作数栈(Operand Stack)扮演着至关重要的角色,它是Java字节码解释执行的核心部分。本文将详细探讨rewolf-...
Operand Stack Frame Data Possible Implementations of the Java Stack Native Method Stacks Execution Engine The Instruction Set Execution Techniques Threads Native Method Interface The Real ...
在JVM中,栈桢(Stack Frame)是Java方法执行的基本单元。每个方法都对应一个栈桢,栈桢包含了方法的局部变量、操作数栈、方法返回地址等信息。在Java程序执行过程中,JVM会根据方法的调用关系创建和销毁栈桢。 二...
2. **操作数栈顶指针(Operand Stack Pointer)**:指向操作数栈的顶部,操作数栈是一个后进先出(LIFO)的数据结构,用于存储计算过程中的数据。 3. **当前执行环境指针(Frame Pointer)**:指向当前执行的方法的...
栈的主要任务是为每个方法的执行提供一个栈帧(Stack Frame),栈帧存储了方法执行过程中的局部变量、操作数栈、动态连接和方法返回地址等关键信息。 栈帧是虚拟机栈的元素,它包含了以下几个重要组成部分: 1. ...
7. **操作数栈(Operand Stack)** - 操作数栈用于暂存中间结果,支持方法内表达式的计算。它是一个后进先出的数据结构,在执行字节码指令时用于存放临时变量和操作结果。 8. **动态链接(Dynamic Linking)** - ...
2. **操作数栈顶寄存器**(Operand Stack Top Register, optop):指示操作数栈顶的位置。 3. **帧指针寄存器**(Frame Pointer Register, frame):指向当前方法调用帧的起始位置。 4. **变量槽指针寄存器**...
每个线程在启动时都会创建一个独立的虚拟机栈,用于存储每个线程在执行过程中产生的栈帧(Stack Frame)。栈帧是虚拟机栈中存储的基本单元,与Java方法调用紧密关联。 栈帧是一个内存区块,包含了多个数据结构,如...
- **操作数栈(Operand Stack)**:支持方法内的表达式计算,通过栈操作(如Push/Pop)进行数据的存取。 - **帧数据区(Frame Data)**:包括常量池解析结果、方法返回时的处理以及异常处理信息。 - **异常处理**:当...
- **栈帧(Stack Frame)**:每个方法被调用时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - **局部变量表(Local Variable Table)**:用于存储方法参数和方法内部定义的局部变量。 ...
在Java编程语言中,堆栈内存布局主要涉及Java虚拟机(JVM)的栈帧(Stack Frame)结构,这是执行方法时的一个重要概念。本文将深入解析OpenJDK中的堆栈内存布局,特别是针对hotspot虚拟机的部分。 首先,我们要理解...
栈帧(Stack Frame)是栈内存的基本单位,每次方法调用都会创建一个栈帧。 6. 运行时常量池(Runtime Constant Pool): 存储类中的常量、方法引用等信息。在类加载过程中,常量会被解析并放入运行时常量池。与...
- **Operand Stack Pointer**:操作数栈指针,用于指向操作数栈顶部。 - **Frame Pointer**:帧指针,指向当前执行方法的帧的起始位置。 - **Vars Pointer**:变量指针,指向局部变量表中下一个可用的位置。 这些...
1. **栈帧(Stack Frame)**: 栈帧是Java虚拟机为方法调用创建的内存模型,它包含了: - **局部变量表(Local Variables)**:存储方法的参数和局部变量。 - **操作数栈(Operand Stack)**:用于执行算术运算和...
- 操作数栈(Operand Stack) - 动态连接(Dynamic Linking) - 返回地址(Return Address) - 附加信息(Frame Data) 7. **JVM内存模型** - JVM内存模型规定了线程如何访问和共享数据,分为工作内存(线程...
4.25 Frame directives 4.26 Exception tables and Unwind tables 4.27 Assembly language changes after RVCT v2.1 5 Condition Codes 5.1 Conditional instructions 5.2 Conditional execution in ARM state 5.3 ...
ENTER Make Stack Frame for Procedure Parameters HLT Halt IDIV Signed Divide IMUL Signed Multiply IN Input from Port INC Increment by 1 INS/INSB/INSW/INSD Input from Port to String INT/INTO Call to ...
9. **Stack (栈)**:一种数据结构,遵循后进先出(LIFO)原则。 10. **Spooling System (假脱机系统)**:将打印机等慢速设备与计算机进行缓冲处理,提高工作效率。 11. **Indexed Allocation (索引式分配)**:文件...