这篇文章主要讲解了“Java代码是怎么执行的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java代码是怎么执行的”吧!
众所周知,java代码是不能直接在jvm上执行的,执行的是class文件,将java代码编程class文件,需要编译
常用的编译方法是:javac xxx.java
但目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能
主题上分为五个部分:
方法区,本地方法栈,java堆,java栈,程序计数器
其中,java栈,本地方法栈,程序计数器为线程私有,其余为线程共享
那么,方法在哪个地方执行呢?
java栈。
栈的遵循的方式是先进后出,java栈中方法的执行也遵循此规律,方法执行的步骤又称为栈帧。
上代码:
public class Main {
public static void a(){
b();
}
public static void b(){
c();
}
public static void c(){
System.out.println("Hello world!");
}
public static void main(String[] args) {
a();
}
}
上面是一段很简单的代码,主体上就是:
(1)一个Main类
(2)上面定义了一个main方法
(3)该main方法调用了静态方法a
(4)方法a调用方法b
(5)方法b调用方法c
(6)方法c打印了“Hello world!”
前文说过,java定义的非本地方法都是在java栈内执行的,一方法一栈帧
所以假设
mian方法对应栈帧m
a方法对应栈帧ab方法对应栈帧bc方法对应栈帧c
根据方法的调用,入栈顺序为:m,a,b,c
所以,栈帧出栈(即方法执行)顺序为:c,b,a,m
上一节,方法或栈帧在java栈的执行顺序,但在方法体内的内容是怎么执行的呢。
前文提到,jvm执行的是class文件,而class文件内是什么?
class文件内是一组指令集。
如何证明呢,还是再看一段代码。
public class Calculator{
public int add(){
int n = 10;
int m = 20;
int r = n + m;
return r;
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
int a = calculator.add();
System.out.println(a);
}
}
如上代码,实现的功能是:
(1)定义两个变量,相加
(2)main方法new对象,调用方法
但,class文件是不可以直接查看的。
我们可以采用反编译的方法,反编译命令:
javap -c xxx.class
每个方法下面的Code,都是一组指令集。
在讨论指令集之前,首先要讲一个概念,那就是对栈帧进一步拆分。
栈帧一共分为四个部分:局部变量表、操作数栈、动态链接、方法返回地址
其中,局部变量表和操作数栈是最重要的两个部分,局部变量表存放在方法中定义的局部变量,操作数栈相当于jvm的一个缓存,所有的操作都必须在此处进行,所有的变量都必须加载到操作数栈才能被使用。所以,所谓指令,就是在局部变量表和操作数栈来回倒腾的过程。
下面对指令进行分类讲解:
(1)入栈指令
整型入栈指令:
取值-1~5采用iconst指令;
取值-128~127采用bipush指令;
取值-32768~32767采用sipush指令;
取值-2147483648~2147483647采用ldc指令。
非整型入栈指令:
float,String类型也使用ldc指令
double和long类型使用ldc_2w
boolean类型视作0和1
null的入栈指令为:aconst_null
(2)存储指令
将操作数栈中的常量保存在局部变量表中的某个位置
如:
istore_1:将上面入栈的整型常量保存在局部变量表中的第1个位置
fstore_2:将上面入栈的浮点常量保存在局部变量表中的第2个位置
dstore_10:将上面入栈的双浮点常量保存在局部变量表中的第10个位置
lstore_20:将上面入栈的长整常量保存在局部变量表中的第20个位置
astore_100:将上面入栈的引用常量保存在局部变量表中的第100个位置
(3)变量入栈指令
iload_1:局部变量表中的第1个位置的整型变量入栈
fload_2:局部变量表中的第1个位置的浮点型变量入栈
dload_10:局部变量表中的第1个位置的双浮点型变量入栈
lload_20:局部变量表中的第1个位置的长整型变量入栈
aload_100:局部变量表中的第100个位置的引用型变量入栈
(4)计算指令
加:iadd、ladd、fadd、dadd
减:isub、lsub、fsub、dsub
乘:imul、lmul、fmul、dmul
除:idiv、ldiv、fdiv、ddiv
注意:栈顶计算,一次只能计算一个表达式
感谢各位的阅读,以上就是“Java代码是怎么执行的”的内容了,经过本文的学习后,相信大家对Java代码是怎么执行的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。