iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈一段java代码是如何执行的
  • 486
分享到

浅谈一段java代码是如何执行的

2024-04-02 19:04:59 486人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 编译成class2. JVM的构成3. 方法的顺序执行和栈帧4. class文件反编译过后的样子5. 指令集详解本文分享自华为云社区《一段java代码是如何执行的》,原文作

本文分享自华为云社区《一段java代码是如何执行的》,原文作者:技术火炬手 。

当你学会了java语言之后,你写了一些代码,然后你想要执行你的代码,来达成某些功能。那么,你都知道这段代码都是如何执行的吗?

1. 编译成class

众所周知,java代码是不能直接在jvm上执行的,执行的是class文件,将java代码编程class文件,需要编译

常用的编译方法是:javac xxx.java

但目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能

2. jvm的构成

让我们回忆一下jvm的构成:

主题上分为五个部分:

方法区,本地方法栈,java堆,java栈,程序计数器

其中,java栈,本地方法栈,程序计数器为线程私有,其余为线程共享

那么,方法在哪个地方执行呢?

java栈。

栈的遵循的方式是先进后出,java栈中方法的执行也遵循此规律,方法执行的步骤又称为栈帧。

3. 方法的顺序执行和栈帧

上代码:


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

4. class文件反编译过后的样子

上一节,方法或栈帧在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,都是一组指令集。

5. 指令集详解

在讨论指令集之前,首先要讲一个概念,那就是对栈帧进一步拆分。

栈帧一共分为四个部分:局部变量表、操作数栈、动态链接、方法返回地址

其中,局部变量表和操作数栈是最重要的两个部分,局部变量表存放在方法中定义的局部变量,操作数栈相当于jvm的一个缓存,所有的操作都必须在此处进行,所有的变量都必须加载到操作数栈才能被使用。所以,所谓指令,就是在局部变量表和操作数栈来回倒腾的过程。

下面对指令进行分类讲解:

(1)入栈指令

整型入栈指令:

  • 取值-1~5采用iconst指令;
  • 取值-128~127采用bipush指令;
  • 取值-32768~32767采用sipush指令;
  • 取值-2147483648~2147483647采用ldc指令。

非整型入栈指令:

  1. float,String类型也使用ldc指令
  2. double和long类型使用ldc_2w
  3. boolean类型视作0和1
  4. 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代码执行内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈一段java代码是如何执行的

本文链接: https://www.lsjlt.com/news/122913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈一段java代码是如何执行的
    目录1. 编译成class2. jvm的构成3. 方法的顺序执行和栈帧4. class文件反编译过后的样子5. 指令集详解本文分享自华为云社区《一段java代码是如何执行的》,原文作...
    99+
    2024-04-02
  • V8是怎么执行一段JavaScript代码的
    这篇文章主要讲解了“V8是怎么执行一段JavaScript代码的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“V8是怎么执行一段JavaScript代码的”吧!编译器和解释器之所以存在编译器...
    99+
    2023-07-06
  • 浅谈MyBatis 如何执行一条 SQL语句
    目录前言 基础组件 工作流程 初步使用 详细流程 获取 MapperProxy 对象 缓存执行方法 构造参数 获取需要执行的 SQL 对象 执行 SQL 语句 总结 前言 Myba...
    99+
    2024-04-02
  • 详解V8是如何执行一段JavaScript代码原理
    目录前言编译器和解释器1. 生成抽象语法树(AST)和执行上下文2. 生成字节码3. 执行代码JavaScript 的性能优化前言 了解 V8 的执行机制,能帮助你从底层了解 Ja...
    99+
    2023-05-15
    V8 执行JavaScript原理 V8 JavaScript
  • 浅谈Java文件被执行的历程
    目录Java的编译过程一个例子第一步第二步Java的编译过程 Java程序从源文件创建到程序运行要经过两大步骤 1、源文件由编译器编译成字节码(ByteCode) 2、字节码由ja...
    99+
    2024-04-02
  • java计算代码段执行时间的详细代码
    java里计算代码段执行时间可以有两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算。 一)毫秒级别计算时间 long startTime = System.curren...
    99+
    2024-04-02
  • 浅谈如何测试Python代码
    目录一、介绍二、测试范围三、单元测试四、第一个测试用例五、异常测试六、mounttab.py七、测试覆盖率八、总结一、介绍 编写测试检验应用程序所有不同的功能。每一个测试集中在一个关...
    99+
    2024-04-02
  • Java中的静态代码块是如何执行的
    Java中的静态代码块是如何执行的?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行...
    99+
    2023-05-31
    java ava
  • vue中怎么持续执行一段代码
    本篇内容介绍了“vue中怎么持续执行一段代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、使用setInterval方法setInter...
    99+
    2023-07-06
  • 如何解决Jquery $.ajax函数外的一段代码的执行顺序
    本篇内容主要讲解“如何解决Jquery $.ajax函数外的一段代码的执行顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Jquery $.ajax函...
    99+
    2024-04-02
  • 浅谈如何提高PHP代码的质量
    目录概述1 必备条件2 构建工具3 静态代码分析4 代码风格5 复制 / 粘贴检测器6 想要真正深入的代码分析?概述 我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系...
    99+
    2024-04-02
  • 浅谈如何重构冗长的Python代码
    目录1.将for循环转换为list/dictionary/set 表达式2.用增量赋值替换赋值3.只使用一次的内联变量4.用if表达式替换if语句5.用生成器代替不需要的表达式6.将...
    99+
    2023-05-15
    Python重构 重构Python代码 重构代码
  • Java计算代码段执行时间的详细过程
    目录前言场景代码实现MethodBody 接口定义CalcExecuteTimeResult 运行结果实体ExecuteTemplate 执行模板定义CalcExecuteTimeC...
    99+
    2023-02-07
    Java代码段执行时间 Java代码段运行时间
  • java代码如何实现异步执行
    在Java中,可以使用多线程或者使用Java 8之后引入的CompletableFuture来实现异步执行。 使用多线程: Th...
    99+
    2023-10-25
    java
  • 如何进行Java 同步机制浅谈
    如何进行Java 同步机制浅谈,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就...
    99+
    2023-06-03
  • java代码块的执行顺序是什么
    Java代码块的执行顺序如下: 静态代码块:静态代码块在类加载时执行,并且只执行一次。它用来初始化静态变量或执行一些只需执行一次...
    99+
    2023-10-24
    java
  • java代码块执行顺序是怎样的
    本文小编为大家详细介绍“java代码块执行顺序是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“java代码块执行顺序是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、类的静态代码块、结构代码块、结...
    99+
    2023-06-30
  • 浅谈一下Java中集合的迭代方式
    目录集合的迭代传统的迭代方法Stream 和 Lambda 进行集合迭代流和集合方式一:推荐使用,采用函数式编程(链式编程):方式二:不推荐使用,采用函数式编程(不使用链式编程):方...
    99+
    2023-05-14
    Java集合 Java集合迭代方式
  • 浅谈Java由于不当的执行顺序导致的死锁
    我们来讨论一个经常存在的账户转账的问题。账户A要转账给账户B。为了保证在转账的过程中A和B不被其他的线程意外的操作,我们需要给A和B加锁,然后再进行转账操作, 我们看下转账的代码: ...
    99+
    2024-04-02
  • 怎么在启动Jupyter Notebook时自动执行一段代码
    本篇内容主要讲解“怎么在启动Jupyter Notebook时自动执行一段代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在启动Jupyter Notebook时自动执行一段代码”吧!在我...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作