时间:2021-05-19
本文分享自华为云社区《一段java代码是如何执行的》,原文作者:技术火炬手 。
当你学会了java语言之后,你写了一些代码,然后你想要执行你的代码,来达成某些功能。那么,你都知道这段代码都是如何执行的吗?
众所周知,java代码是不能直接在jvm上执行的,执行的是class文件,将java代码编程class文件,需要编译
常用的编译方法是:javac xxx.java
但目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能
让我们回忆一下jvm的构成:
主题上分为五个部分:
方法区,本地方法栈,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)入栈指令
整型入栈指令:
非整型入栈指令:
(2)存储指令
将操作数栈中的常量保存在局部变量表中的某个位置
如:
(3)变量入栈指令
(4)计算指令
注意:栈顶计算,一次只能计算一个表达式
到此这篇关于浅谈一段java代码是如何执行的的文章就介绍到这了,更多相关java代码执行内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP间隔一段时间执行代码的方法。分享给大家供大家参考。具体分析如下:PHP如何设置每隔一段时间自动执行某段代码?例如定时生成静态文件之类的,这就
java是一门相对安全的语言,那么数据溢出时它是如何处理的呢?看一段代码,publicclassOverflow{/***@paramargs*/publics
JavaScript中的循环用来将同一段代码执行指定的次数(或者当指定的条件为true时)。JavaScript循环在编写代码时,你常常希望反复执行同一段代码。
本文实例讲述了Java同步代码块和同步方法。分享给大家供大家参考,具体如下:一点睛所谓原子性:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况。言外之
Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段