[jvm解析系列][十三]字节码指令小节,从字节码看jvm的栈解释器执行过程。(代码片段)

胖子程序员 胖子程序员     2022-12-04     610

关键词:

众所周知,JVM以前一直采用的是解释执行,但是后来在历代的版本更迭中也加入了编译执行。所以总的来说JVM是包含了解释执行和编译执行。这一部分不属于JVM的范畴了,已经属于编译了,大多数都是进行词法分析之类的,以后有时间会补充。

同时大家都知道现在大体上分为两种指令集架构,第一种就是基于栈的第二种是基于寄存器的,简单点说,基于寄存器的架构速度更快,但是可移植性不强,但是基于栈的指令集架构虽然慢,但是可移植性很强,大家都知道java本身就是依靠可移植性出名的,所以无可争议的使用了栈的指令集架构。(也有例外,dalvik是基于寄存器的)

下面我们详述一下JVM的栈解释器执行过程,在此之前我们先来讲一下字节码的指令含义:



加载和存储:加载和存储指令一般可以把栈帧中的局部变量放到操作数栈中,然后把操作数栈中的变量存回栈帧中。

把局部变量加载到操作数栈中:主要有iload,liload_<n>,lload,(每一个指令前面代表的是它操作的数据类型iload就是int   lload就是long,接下来我们去除前面的前缀统一用x代替减少篇幅。)

从操作数栈中存回局部变量表 xstore_<n>,xstore(注意有的后面跟了_<n>这是省略了诸如xstore_1,xstore_2这样的指令,xstore默认为xstore_0,之后统一用xstore_<n>替代)

加载一个常量到操作数栈:xipush,xdc,xconst_<n>



运算指令:执行加减乘除取余等运算

加:xadd

减:xsub

乘:xmul

除:xdiv

取余:xrem

取反:xneg

位移:xshl。xshr

按位或指令:xor

按位与指令:xand

按位异或指令:xxor

比较指令:xcmpl



指令上我们大概就讲这么多,接下来就是我们查看字节码的时刻了。首先写一个方法如下:

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		int a = 2;
		int b = 1;
		int c = a+b;
		System.out.println(c);
	


然后我们用javap查看一下字节码



可以看到我们的操作从第01两行来看这事int a =2;的操作,先放置常量2到栈顶然后取出来放到常量表中1的位置。23同样。

而45这两个数字就是把局部变量表上12这两个位置的数加载到操作栈中,然后用6行相加存入常量表3的位置。

为了表明0123和7真的实在存储数字到常量表我们对方法做如下修改:

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		int c = 1+2;
		System.out.println(c);
	
字节码如下

很明显的之前的0123行那种存储的行为没有了,同样我们能看到javac给我们的优化,在第0行把1+2直接变成了3。

jvm进阶之字节码指令解析(中篇)(代码片段)

字节码指令解析中篇一、对象的创建与访问指令1.创建指令2.字段访问指令3.数组操作指令4.类型检查指令二、方法的调用与返回指令1.方法调用指令2.方法返回指令三、操作数栈管理指令1.基本概述2.指令分类3.程序举例一、对象的... 查看详情

jvm进阶之字节码指令解析(上篇)

字节码指令解析上篇一、加载与存储指令1.作用2.常用指令3.操作数栈4.局部变量表5.压栈指令6.入栈指令7.出栈指令二、算术指令1.基本概述2.实际类型和运算类型对应关系3.指令分类4.注意细节5.相关问题三、类型转换指令1.基本概... 查看详情

jvm中篇-05-字节码指令集与解析

jvm中篇-05-字节码指令集与解析​​1.概述​​​​1.1执行模型​​​​1.2字节码与数据类型​​​​1.3字节码分类​​​​2.加载与存储指令​​​​2.1再谈操作数栈与局部变量表​​​​2.2局部变量压栈指令​​​​2.3常量入... 查看详情

jvm学习笔记字节码指令集解析

一、class的文件结构1前端编译器  AOT效率较高,但只支持Linux平台。2透过字节码查看代码执行细节-1  源代码如下:publicclassTest publicstaticvoidmain(String[]args) Integerx=5; inty=5; System.out.println(x==y); Integ 查看详情

深入理解jvm——helloworld字节码完整解析(代码片段)

...字节码结构2.2javap-v指令查看字节码结构 3、字节码完整解析3.1魔数3.2 minor_version,major_version3.3 Constant_pool_count,constant_pool[constant_pool_count-1] 3.3.1 CON 查看详情

深入理解jvm——helloworld字节码完整解析(代码片段)

...字节码结构2.2javap-v指令查看字节码结构 3、字节码完整解析3.1魔数3.2 minor_version,major_version3.3 Constant_pool_count,constant_pool[constant_pool_count-1] 3.3.1 CON 查看详情

jvm进阶之字节码文件解析指令(代码片段)

字节码文件解析指令1.javac指令2.javap指令1.javac指令使用javac命令可以将源代码文件编译成字节码文件,然后就可以查看代码中的详细结构。对于命令行的方式而言,我们可以使用javacxx.java或者javac-gxx.java进行编译,只... 查看详情

jvm进阶之字节码指令解析(下篇)(代码片段)

字节码指令解析下篇一、控制转移指令1.比较指令2.条件跳转指令3.比较条件跳转指令4.多条件分支跳转指令5.无条件跳转指令二、异常处理指令1.异常抛出指令2.异常处理指令三、同步控制指令1.方法级的同步2.方法内指令序列的同... 查看详情

jvm学习笔记字节码指令集解析(代码片段)

一、class的文件结构1前端编译器  AOT效率较高,但只支持Linux平台。2透过字节码查看代码执行细节-1  源代码如下:publicclassTest publicstaticvoidmain(String[]args) Integerx=5; inty=5; System.out.println(x==y); Integ 查看详情

day350.字节码指令集与解析举例-jvm(代码片段)

字节码指令集与解析举例一、概述1、执行模型jvm虚拟机的执行模型流程,根据pc寄存器在记录接下来要执行的位置,来自旋的执行判断操作码与操作数2、字节码与数据类型操作码指令会携带操作的数据类型3、指令分析二... 查看详情

jvm总括三-字节码字节码指令jit编译执行

JVM总括三-字节码、字节码指令、JIT编译执行   java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲解),屏蔽对操作系统的依赖。一个字节(8位)可以储存256... 查看详情

深入理解jvm-字节码指令(代码片段)

深入理解JVM-字节码指令前言​字节码指令的部分更多要和实战搭配学习和使用,所以这一节将会是简单概述字节码的相关指令内容,和class结构不同,字节码指令常见的命令是需要了解的,虽然我们很多时候并不需要研究底层字... 查看详情

jvm进阶之路十二:字节码指令

在前面我们已经学习了JVM字节码是JVM能直接识别的语言,了解了字节码文件的文件结构。在这篇文章里,我们进一步学习字节码的相关指令。在前面的【JVM进阶之路】三:探究虚拟机对象里,提到了对象的初始化过程,对象初始... 查看详情

深入jvm字节码(代码片段)

...码1.深入剖析class文件结构1.1初探class文件1.2class文件结构解析1.2.1魔数1.2.2版本号1.2.3常量池1.2.4Accessflags1.2.5this_class,super_name,interfaces1.2.6字段表1.2.7方法表1.2.8属性表1.3使用javap查看类文件2.字节码基础2.1字节码概述2.2java虚拟机栈和... 查看详情

jvm字节码简介

1、概述  java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(成为操作码,Opcde)和跟随其后的0到多个此操作所需参数(操作数,Operands)。由于操作码的长度为一个字节,所以指令集的操作数总数不能超... 查看详情

jvm进阶之字节码指令概述(代码片段)

字节码指令概述1.基本介绍2.执行模型3.数据类型4.指令分类1.基本介绍Java字节码指令对于虚拟机,就好比汇编语言对于计算机,都属于基本执行指令。Java字节码指令由一个字节长度的、代表着某种特定操作含义的数字ÿ... 查看详情

[jvm解析系列][十一]字节码执行之栈帧,你的字节码是如何运行的?(代码片段)

在之前的章节中我们讲解了jvm的内存分配和管理,class的文件结构,就差之行了。那么从第十一章开始我们就开始讲java虚拟机是如何执行一个class文件的。首先我们应该明确虚拟机是区别于物理机的一种说法,物理机... 查看详情

jvm(42),指令集----字节码与数据类型

...须拥有各自独立的操作码。对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务: 查看详情