java虚拟机规范-运行时栈帧
前言
java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调。
引用
栈帧
- 每当一个java方法被执行时都会在虚拟机中新创建一个栈帧,方法调用结束后即被销毁。
- 栈帧存储空间为虚拟机栈,每一个栈帧都有自己的局部变量表、操作数栈和指向当前方法所属的类的运行时常量池的引用。
- 在每个线程中,只有目前正在执行的那个方法的栈帧是活动的。这个栈帧就称为当前栈帧(current frame),这个栈帧对应的方法称之为当前方法(current method)。定义这个方法的类就称之为当前类(current class)。对局部变量表和操作数栈的各种操作,通常都指的是对当前栈帧的局部变量表和操作数栈进行的操作。如下图所示,
变量
局部变量
- 每一个栈帧包含一组局部变量,这组局部变量中包含了方法运行时所需要的所有的变量(含this引用)、方法参数和其他定义的局部变量。局部变量的类型包括以下几种:
- boolean
- byte
- char
- short
- int
- float
- reference
- returnAddress
- long
- double
- 除了long和double外,其他所有的变量在局部变量表中都只占一个槽位(slot),而long和double占2个槽位。
- 特别值得一提的是,当一个实例方法被调用的时候,局部变量表中的第0个局部变量一定是用来存储被调用的实例方法所在的对象引用。(this关键字,可以参考下面示例中的字节码截图),后续的其他参数将会传递至从1开始的局部变量表位置上。
- 示例:
- 以下图中的代码为例:
- 对应的字节码如下:
- 具体的操作流程示意:
- 释义:
- 从上图中我们可以看出例如
int x=12
,在jvm中对应着两个指令bipush 10
,bipush指令用于将一个byte作为一个整型数字插入到操作数栈中(oprand stack),这里将10插入到操作数栈istore_1
,istore_1指令(实际上这个应该称之为操作码opcode,指令是指操作码加上操作数oprand)是istore_指令组中的一个,用于将一个整型数字存储到局部变量中,<n>
代表的是局部变量表中的存储位置,同时只能为0,1,2,3;超过3了就只能使用istore指令。
- 注意,
istore_1
操作码和istore 4
指令两者的区别为- 前者只是一个操作码,只占一个单位的长度,后者是操作码和操作数组合的指令,占2个单位的长度。(注意看Code中每一行指令前面的数字)
- 从上图中我们可以看出例如
- 思考:
- 看了上图的字节码中可能有人会问,为什么还需要istore和iload这两个指令呢?这是因为栈本身不是用来存储数据的,而是用局部变量表来存储。局部变量通过索引寻址。
java虚拟机规范-运行时栈帧的更多相关文章
- 【转载】深入理解Java虚拟机笔记---运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...
- java虚拟机规范-运行时数据区
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机 ...
- 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构
运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...
- Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)
Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...
- 计算机是如何计算的、运行时栈帧分析(神奇i++续)
关于i++的疑问 通过JVM javap -c 查看字节码执行步骤了解了i++之后,衍生了一个问题: int num1=50; num1++*2执行的是imul(将栈顶两int类型数相乘,结果入栈), ...
- Java虚拟机一 运行时数据区(栈、堆、方法区等)
Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的 ...
- Java虚拟机及运行时数据区
1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...
- Java虚拟机_运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途.各自的创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程启动 ...
- 【Java虚拟机】运行时数据区
Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...
随机推荐
- Redis : 为什么我们做分布式使用 Redis ?(转)
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...
- P3190 [HNOI2007]神奇游乐园
传送门 第一道插头 $dp$ 由于讲不清楚所以假装各位早就会插头 $dp$ 了 首先要的是一个闭合回路,所以可以用括号表示法表示状态,然后大力分类讨论 $1.$ 没有右插头和下插头 那么我们可以啥也不 ...
- IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); 时,报COMException
解决办法: 在Program.cs的Main函数中添加如下代码: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
- 机器学习-KNN算法详解与实战
最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...
- Qt项目管理文件(.pro)及其作用详解
http://c.biancheng.net/view/1819.html 在 Qt Creator 中新建一个 Widget Application 项目 samp2_1,在选择窗口基类的页面选择 ...
- STM32 GPIO相关
1. STM32 的 IO 作为输入的时候,可以程序设置上下拉电阻(可以不用外接上下拉电阻). 2.GPIO有四种输入模式:浮空输入.上拉输入.下拉输入.模拟输入: 3.GPIO有四种输出模式:开漏输 ...
- Codeforces 940 区间DP单调队列优化
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- php内置函数分析range()
PHP_FUNCTION(range) { zval *zlow, *zhigh, *zstep = NULL, tmp; , is_step_double = ; double step = 1.0 ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- 可决系数R^2和方差膨胀因子VIF
然而很多时候,被筛选的特征在模型上线的预测效果并不理想,究其原因可能是由于特征筛选的偏差. 但还有一个显著的因素,就是选取特征之间之间可能存在高度的多重共线性,导致模型对测试集预测能力不佳. 为了在筛 ...