`

JVM学习笔记(九):基于栈的解释器执行过程

 
阅读更多

本文根据《深入理解java虚拟机》第8章部分内容整理

 

根据一个代码实例来介绍虚拟机中解释器的执行过程,代码如下所示:

 

Java代码 复制代码 收藏代码
  1. public int calculate(){   
  2.     int a = 100;   
  3.     int b = 200;   
  4.     int c = 300;   
  5.     return (a + b) * c;   
  6. }  
public int calculate(){
	int a = 100;
	int b = 200;
	int c = 300;
	return (a + b) * c;
}

由上面的代码可以看出,该方法的逻辑很简单,就是进行简单的四则运算加减乘除,我们编译代码后使用javap -verbose命令查看字节码指令,具体字节码代码如下所示: 

 

Dos代码 复制代码 收藏代码
  1. public int calculate();   
  2.   Code:   
  3.    Stack=2, Locals=4, Args_size=1  
  4.    0:   bipush  100  
  5.    2:   istore_1   
  6.    3:   sipush  200  
  7.    6:   istore_2   
  8.    7:   sipush  300  
  9.    10:  istore_3   
  10.    11:  iload_1   
  11.    12:  iload_2   
  12.    13:  iadd   
  13.    14:  iload_3   
  14.    15:  imul   
  15.    16:  ireturn   
  16.   LineNumberTable:   
  17.    line 30  
  18.    line 43  
  19.    line 57  
  20.    line 611  
  21.   
  22. }  
public int calculate();
  Code:
   Stack=2, Locals=4, Args_size=1
   0:   bipush  100
   2:   istore_1
   3:   sipush  200
   6:   istore_2
   7:   sipush  300
   10:  istore_3
   11:  iload_1
   12:  iload_2
   13:  iadd
   14:  iload_3
   15:  imul
   16:  ireturn
  LineNumberTable:
   line 3: 0
   line 4: 3
   line 5: 7
   line 6: 11

}

 根据字节码可以看出,这段代码需要深度为2的操作数栈(Stack=2)和4个Slot的局部变量空间(Locals=4)。下面,使用7张图片来描述上面的字节码代码执行过程中的代码、操作数栈和局部变量表的变化情况。

执行偏移地址为0的指令的情况

 

上图展示了执行偏移地址为0的指令的情况,bipush指令的作用是将单字节的整型常量值(-128~127)推入操作数栈顶,后跟一个参数,指明推送的常量值,这里是100。

执行偏移地址为1的指令的情况

 

上图则是执行偏移地址为1的指令,istore_1指令的作用是将操作数栈顶的整型值出栈并存放到第1个局部变量Slot中。后面四条指令(3、6、7、10)都是做同样的事情,也就是在对应代码中把变量a、b、c赋值为100、200、300。后面四条指令的图就不重复画了。

执行偏移地址为11的指令的情况

上面展示了执行偏移地址为11的指令,iload_1指令的作用是将局部变量第1个Slot中的整型值复制到操作数栈顶。

执行偏移地址为12的指令的情况

上图为执行偏移地址12的指令,iload_2指令的执行过程与iload_1类似,把第2个Slot的整型值入栈。

执行偏移地址为13的指令的情况

上图展示了执行偏移地址为13的指令情况,iadd指令的作用是将操作数栈中前两个栈顶元素出栈,做整型加法,然后把结果重新入栈。在iadd指令执行完毕后,栈中原有的100和200出栈,它们相加后的和300重新入栈。

执行偏移地址为14的指令的情况

上图为执行偏移地址为14的指令的情况,iload_3指令把存放在第3个局部变量Slot中的300入栈到操作数栈中。这时操作数栈为两个整数300,。

下一条偏移地址为15的指令imul是将操作数栈中前两个栈顶元素出栈,做整型乘法,然后把结果重新入栈,这里和iadd指令执行过程完全类似,所以就不重复画图了。

执行偏移地址为16的指令的情况

上图是最后一条指令也就是偏移地址为16的指令的执行过程,ireturn指令是方法返回指令之一,它将结束方法执行并将操作数栈顶的整型值返回给此方法的调用者。到此为止,该方法执行结束。

 

注:上面的执行过程只是一种概念模型,虚拟机最终会对执行过程做出一些优化来提高性能,实际的运作过程不一定完全符合概念模型的描述。不过从这段程序的执行过程也可以看出栈结构指令集的一般运行过程,整个运算过程的中间变量都是以操作数栈的出栈和入栈为信息交换途径。

分享到:
评论

相关推荐

    JVM学习笔记核心知识点整理

    ### JVM学习笔记核心知识点整理 #### 一、引言与背景 随着软件开发技术的不断发展,Java作为一种广泛应用的编程语言,其背后的核心技术——Java虚拟机(JVM)的重要性日益凸显。掌握JVM不仅可以帮助开发者更好地理解...

    java之jvm学习笔记十而(访问控制器的栈校验机制)

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,确保程序的正确运行。在JVM的设计中,访问控制器扮演着关键角色,它负责执行严格的类型检查,确保代码的安全性。本文将深入探讨“访问控制器的栈...

    ImagesForJVM-JVM笔记图片

    5. **字节码执行**:JVM通过字节码解释器执行字节码指令,还可以通过Just-In-Time(JIT)编译器将热点代码编译为机器码,提高运行效率。 6. **类的生命周期**:从加载到卸载,一个类在JVM中的完整生命周期包括加载...

    Java分布式应用学习笔记02再谈JVM

    ### Java分布式应用学习笔记02再谈JVM 在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与...

    java基础学习笔记

    ### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...

    学习笔记之对象的创建(Java)

    - **解释或编译**:JVM解释器逐行解释字节码,或者使用即时编译器(JIT Compiler)将热点代码编译成本地机器码,以提高性能。 #### Java平台结构 Java平台的核心组件是JVM,它位于平台的中心,其上下分别连接着...

    java 学习笔记包括 JVM 集合 Spring ,Spring cloud, Mysql ,redis ,kaf.zip

    Java学习笔记涵盖了许多核心的IT知识点,以下是这些主题的详细说明: **JVM(Java虚拟机)** Java虚拟机是Java程序运行的基础,它负责解释和执行字节码。理解JVM的工作原理对于优化程序性能至关重要。这包括类加载...

    jdk6.0学习笔记

    ### JDK 6.0 学习笔记精要 #### 一、Java 概览 - **Java 的起源与发展** - Java 最初是由 Sun Microsystems 的 Green Project 开发出来的,最初是为了设计 Star7 应用程序而创建的一种编程语言。 - 名称由来:...

    Java入门学习笔记

    ### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    java学习笔记4

    以上内容是基于“java学习笔记4”的标题和描述所推测的可能知识点,具体的学习内容需参考“video4”这个压缩包文件中的详细资料。对于初学者和有经验的开发者来说,这些知识点都是非常有价值的。

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    ### 韩顺平Java从入门到精通视频教程学习笔记整理 #### Java开发平台与运行机制 - **J2SE(Java 2 Platform Standard Edition)**:Java的标准版平台,适用于开发桌面应用程序,包含了Java的核心类库和技术。 - **...

    Notes:学习笔记:java,Javaweb,LInux,计算机网络,操作系统,JVM虚拟机,数据结构

    综上所述,这些学习笔记涵盖了软件开发中的多个核心领域,从基础的编程语言到Web开发,再到系统层面的操作系统和网络,以及深入的JVM理解和数据结构学习。对于希望全面掌握IT技术的学者或开发者来说,这些都是必不可...

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    - **高性能**:尽管是一种解释型语言,但通过 JIT 编译等技术实现了高效的执行速度。 ### Java 第一个程序:Hello World 示例 下面是一个简单的 Java 程序示例,用于输出 “Hello World!”: ```java public ...

    笔记CoderEsky

    - JDK(Java Development Kit):包含了编译器javac、解释器java等必备工具。 - IDE(集成开发环境):如Eclipse、IntelliJ IDEA,提供便捷的代码编写、调试和测试环境。 - Maven或Gradle:项目构建工具,管理...

    java笔记 java笔记

    3. **加载与执行**:通过Java虚拟机(JVM)加载字节码并解释执行。 #### 1.3 Java目录结构 Java开发环境通常包括以下几个关键目录: - **src**:存放源代码。 - **bin**:存放编译后的字节码文件。 - **lib**:存放...

    java体系笔记

    2. 字节码执行:通过解释器和即时编译器(JIT)将字节码转换为机器指令执行。 3. 类加载器:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和自定义类加载器。 十二、Java开发工具 Eclipse、...

    传智博客JAVA基础笔记个人总结

    这份笔记是基于传智播客的课程内容,结合了牛牧老师和水镜老师的讲解精华,提供了27天的学习计划,每天都有深入的知识点解析和实践练习。 1. **Java基础知识**:这部分涵盖了Java语言的基础概念,包括变量、数据...

    安卓学习第一周周笔记

    - **JDK (Java Development Kit)**:Java开发工具包,包含了开发Java程序所需的全部组件,包括编译器、解释器等。 - **JRE (Java Runtime Environment)**:Java运行环境,提供Java程序运行时所需要的环境。 - **JVM ...

    java笔记大全

    - **安装Java Development Kit (JDK)**:JDK是Java开发的基础,包含编译器、解释器和其他工具。 - **配置环境变量**:为了方便在命令行中编译和运行Java程序,需要设置JAVA_HOME、PATH等环境变量。 - **IDE选择与...

Global site tag (gtag.js) - Google Analytics