查看具体的执行图示,需要先了解一下 java 线程执行的地方,Java 每一个线程执行字节码指令都是在 jvm 虚拟机栈中完成

1.JVM 虚拟机栈

每一条 JVM 线程都有自己私有的 JVM 栈(Java Virtual Machine Stack),这个栈与线程同时创建,用于存储帧(Frames)。JVM 栈的作用与传统语言(例如 C 语言)中的栈非常类似,就是用于存储局部变量与一些过程结果的地方。另外,它在方法调用和返回中也扮演了很重要的角色。因为除了帧的出栈和入栈之外,JVM 栈不会再受其他因素的影响,所以帧可以在堆中分配,JVM 栈所使用的内存不需要保证是连续的。

栈帧

每一个方法被执行时都会创建一个栈帧,每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

帧(Frames)是用来存储数据和部分结果,由三部分组成:局部变量、操作数栈和帧数据区。

局部变量区与操作数栈的大小要视相应方法而定,他们都是按字长来计算的。编译器在编译时就确定了这些值并存放在 class 文件中。而帧数据区的大小则依赖于具体实现。

当虚拟机调用一个 Java 方法时,他从对应类的类型信息中得到此方法的局部变量区和操作数栈大小,并根据此来分配帧内存,最后压入到栈中。

局部变量区:

局部变量表的大小在编译期间分配,方法运行时不会改变大小。

操作数栈:

与局部变量区相同,操作数栈也是被组织成一个以字长为单位的数组。但是与前者不同的是,他不是通过索引来访问,而是通过标准的栈操作(入栈,出栈)来访问的。比如,如果某个指令把一个值压入到操作数栈中,稍后另一个指令就可以弹出这个值来使用。虚拟机在操作数栈中存储数据的方式与局部变量区相同。

虚拟机把操作数栈作为他的工作区,大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈中。比如,iadd(2 个 int 型变量相加) 指令就要从操作数栈中弹出两个整数,执行加法运算,然后将结果压回操作数栈中。

帧数据区:

除了局部变量区和操作数栈外,帧还需要以下数据来支持常量池解析、正常方法返回以及异常派发机制等内容,这些信息就保存在帧数据区。

Java 虚拟机中的大多数指令都设置及到常量池入口,有些指令仅仅是从常量池中读取数据(int,long,float,double 和 String)后压入栈中;另有一些指令使用常量池的数据来指示要实例化的类型或数组、要访问的自动或要调用的方法;还有些指令需要常量池中的数据才能确定某个对象是否属于某个类或实现了某个接口。每当虚拟机要执行某个需要用到常量池数据的指令时,他都会通过帧数据区中指向常量池的指针来访问它。

2.实战演示:

Test.java

public class Test {

public static void test(){

int a = 1;

int b = 2;

int c = a+b;

int d = 5;

int e = d*c;

}

}

在虚拟机栈的执行流程如图

java中字节码_Java字节码执行图示相关推荐

  1. java中thread实例_Java多线程并发执行demo代码实例

    主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...

  2. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  3. java装逼的话_Java 源码装逼技能之让人懵逼的符号

    源码就是符号位 + 二级制数值.符号位是第一位,0 表示正数,1 表示负数. Java 中 byte 类型一字节八位,可以表示 [1111 1111 , 0111 1111],取值 [-127,127 ...

  4. ACM试题 - ASCII码排序 - Java中字符与对应ASCII码的转换

    Java中字符转换对应ASCII码有两种方式: 第一种: char c = 'a'; byte b = (byte)c; // b=97 第二种: char c = 'a'; int b = c; / ...

  5. fileinputstream_从Java中的FileInputStream读取字节

    以下示例显示了如何从Java中的FileInputStream读取字节. import java.io.File;import java.io.FileInputStream;public class ...

  6. java电脑类_计算机类在Java中的设计于实现码

    计算机类在Java中的设计于实现码 问题描述: 一台计算机是由主板.CPU.显卡.声卡等部件组成的,这些部件通过接口可以直接安插在主板的插槽上,也就是说只要将这些部件简单的安插在一起就可以成功组装出一 ...

  7. java中字节码_Java字节码浅析(—)

    英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么.理解这点不仅能搞清语言特 ...

  8. JAVA中char占用多少字节_Java中char占用几个字节

    https://www.cnblogs.com/louiswong/p/6062417.html https://www.cnblogs.com/fnlingnzb-learner/p/7272348 ...

  9. java中考勤管理_JAVA人事员工考勤管理(含论文)源码

    此系统可以修改,包安装指导,拍下后联系店主.系统品牌: 其他系统 开发语言: .NET 数据库: Mssql 源码参数 源码类别:[毕业设计] 源码类型:B/S 适合人群: 菜鸟进阶 授权类型:商业版 ...

最新文章

  1. 计算机应用主要设计到哪些方面,大学计算机应用基础教案设计.doc
  2. 老男孩IT教育在线3期新学员司毅的计算机的基础知识
  3. 给老婆普及计算机知识
  4. Oracle inline view 简介
  5. URAL1519 Formula 1 —— 插头DP
  6. spring boot 入门荔枝
  7. J2EE应用与移动互联网-写在前头
  8. 利用MAVEN的profile 实现打包环境的切换
  9. 我的python 入门 安装 -- hello world
  10. C/C++编程语言中指针(pointer)介绍
  11. Flask构建微电影(一)
  12. 8.SOA架构:服务和微服务分析及设计--- Web服务及REST服务的服务API与契约版本控制
  13. 拜托,面试别再问我TopK了!!!
  14. 基于Verilog的简易计算器
  15. 操作系统的启动与引导问题 BIOS、UEFI、MBR、GPT
  16. 计算机二级c简介,二级C语言
  17. matlab eemd输出,MATLAB信号处理EEMD工具箱
  18. python微信库无法登录怎么办出现异常_微信出现异常登录了怎么办
  19. 大话西游2人数最多服务器,逆生长!126万玩家再造【大话西游2】“火爆现象”...
  20. 想创业成功?先看看这25家千亿美金的公司是如何炼成的!

热门文章

  1. ubuntu 安装 guetzli
  2. Python -- reload 函数
  3. Java学习笔记2.3.6 运算符与表达式 - 条件运算符
  4. 大数据学习笔记12:搭建伪分布式Spark
  5. Java Web学习笔记06:利用JDBC访问数据库
  6. Java Web应用小案例:实现登录功能
  7. SSM框架笔记10:Spring AOP基础
  8. springmvc 传对象报400_springmvc 通过对象来接收参数,为什么默认会返回该对象?
  9. 每日小记2017.2.20
  10. centos7子系统 win10_Win10下安装CentOS 7双系统详解