`

二、代码编译和执行的整个过程

阅读更多

Java代码编译是由Java源码编译器完成,流程如下:



 

Java字节码执行是由JVM执行引擎完成,流程如下:



 

Java 代码编译和执行的整个过程包含了以下三个重要的机制:

  • Java 源码编译机制
  • 类加载机制
  • 类执行机制

1、Java 源码编译机制

Java 源码编译由以下三个过程组成:

  • 分析和输入到符号表
  • 注解处理
  • 语义分析和生成 class 文件

流程图如下所示:



 最后生成的 class 文件由以下部分组成:

  • 结构信息。包括 class 文件格式版本号及各部分的数量与大小的信息。
  • 元数据。对应于 Java 源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池。
  • 方法信息。对应 Java 源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息。

2、类加载机制

JVM的类加载是通关ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:


加载过程中会先检查类是否被加载过。检查顺序是由下往上,从Costom ClassLoader至Bootstrap ClassLoader逐层检查,只要某个ClassLoader已加载就视为加载此类,保证此类只在被ClassLoader加载一次。而加载的顺序是自顶向下,由上层来逐层尝试加载此类。

 

3、类执行机制

JVM是基于栈的体系机构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:




分享到:
评论

相关推荐

    内存中动态编译执行java代码

    内存中动态编译执行Java代码是一种高级编程技巧,它允许我们在程序运行时根据需要创建、编译和执行新的Java代码。这种技术在某些场景下非常有用,比如在元编程、插件系统、自定义脚本执行或者代码热更新中。在Java中...

    JVM教程之Java代码编译和执行的整个过程(二)

    本教程主要关注Java代码从编写到执行的全过程,分为源码编译和字节码执行两个主要阶段,以及相关的类加载机制。 **1. Java源码编译机制** Java源码编译是从.java文件转换为.class文件的过程。这个过程主要包括以下...

    自动获取SVN代码并编译代码 以及自动部署方案

    一旦代码被获取,自动化脚本会调用编译器(如GCC、MSVC等),将源代码编译成目标代码。编译过程可以通过构建工具(如Make、Maven、Gradle或Visual Studio Build Tools)进行自动化,确保每次代码更改后都能快速生成...

    Java代码的编译与反编译

    整个编译过程可以分为五个主要阶段:词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。这些阶段的目的是从高级语言代码中提取信息,转换为机器语言代码。 2. 词法分析:编译器首先进行词法...

    自动获取svn代码并且编译发布

    12. **发布(Publishing)**: 在代码编译成功后,可能将构建结果发布到服务器,例如部署为 WAR 包到 Tomcat 或其他应用服务器。 通过这些步骤,整个 CI 流程可以自动化,提高开发效率,减少人为错误,并确保代码始终...

    web代码混淆压缩工具和java代码反编译工具

    总的来说,无论是代码混淆还是反编译,都是开发过程中重要的环节,尤其是在保护知识产权和维护软件安全时。混淆可以增加代码的难度,压缩则能优化资源的加载和传输。而反编译工具则有助于理解和调试已编译的代码,...

    Android 源码编译过程

    Android源码编译过程是Android开发中的核心环节,它涉及到一系列复杂的步骤,旨在将源代码...在Android源代码编译过程.txt文件中,应该记录了编译过程中的具体步骤和可能遇到的问题,是学习和解决问题的重要参考资料。

    java代码反编译工具

    这类工具能够将已编译的Java类文件转换回接近原始的Java源代码形式,尽管可能无法完全恢复到与原始代码完全一致,但它们可以帮助开发者分析和调试已有的二进制程序。 标题中提到的“java代码反编译工具”通常指的是...

    Android ndk编译cpp代码后把执行文件推送到手机且授权执行的自动化脚本

    当我们ndk编译cpp之后需要手动执行ndk-build,把执行文件上传手机中,手机打开授予权限,执行文件等整个过程繁琐,可以通过脚本来一条龙完成,专注于代码的编写,不浪费编译和传送的时间。

    广工编译原理实验代码和文档

    在“广工编译原理实验代码和文档”中,我们主要关注的是编译原理这一核心计算机科学主题在实践中的应用。编译原理是研究如何将高级编程语言转换为机器可理解的低级语言(通常为汇编或机器码)的学科。这个实验,特别...

    c语言编译全过程

    本文将深入探讨C语言程序从源代码到可执行文件的整个编译过程,帮助读者理解这一过程中的各个阶段及其作用。 #### 1. 预处理阶段(Preprocessing) 预处理阶段是C语言编译过程的第一步,它主要负责处理源代码中的...

    Fanuc 的宏编译执行器

    使用Fanuc的宏编译器,用户可以将宏程序源代码转化为可执行的二进制格式。这个过程包括以下几个步骤: - **编写源代码**:使用Fanuc规定的宏指令语言编写宏程序。 - **编译**:宏编译器解析源代码,检查语法错误,...

    C语言编译全过程介绍

    整个编译过程主要分为编译和链接两个阶段。 1. **编译过程** 编译过程可以进一步细分为编译预处理和编译/优化两个阶段。 1.1. **编译预处理** 预处理阶段首先处理源代码中的伪指令和特殊符号。具体包括: - **...

    C++编译链接过程详解

    我认为编译的整个过程中应该是在最后生成可执行文件的时候加入的。 四、链接器的使用 许多Visual C++的使用者在编译源码时都碰到过以下链接错误(通常是在使用第三方库时遇到的): LNK2005:symbol already ...

    小颖Java源代码反编译专家

    Java反编译是软件开发过程中一项重要的技术,它允许开发者查看和理解已编译的Java字节码(.class文件)背后的源代码。这在多种场景下非常有用,例如,当我们丢失了源代码或者需要研究已有的二进制库时。"小颖Java源...

    c++编译过程

    链接阶段是整个编译过程的最后一步,它负责将多个目标文件以及库文件链接在一起,生成最终的可执行文件或库。链接器解决外部引用问题,确保程序运行时能够访问到所有必要的符号和数据。 - **静态链接**:在链接过程...

    从github上找出来在C环境下完成编译的代码

    在C编程环境中,完成编译的过程是开发软件的基础步骤,特别是在开源社区如GitHub上,许多开发者分享他们的C语言项目。...在"AECM"项目中,通过成功的编译过程,我们可以确信项目代码在结构和功能上都是完整和可靠的。

    PHP源代码zend编译工具

    传统的PHP解释器会逐行解析PHP代码,但是通过 Zend 编译器,我们可以将整个脚本预先编译成中间字节码,这个过程叫做 Zend 模块,提升了执行效率。当服务器接收到请求时,不再需要逐行解析,而是直接运行编译后的字节...

    《GCC编译流程:从源代码到可执行程序——浅析编译原理》—— 程序的基本编译流程.pdf

    GCC编译流程是从源代码到可执行程序的整个过程,可以分为四个阶段:预处理、编译、汇编和链接。下面将对这些阶段进行详细介绍: 1. 预处理阶段: 在预处理阶段,GCC编译器会读取源代码文件,展开宏定义,包括...

    C语言编译全过程剖析

    在整个编译过程中,预处理和编译阶段处理源代码的文本内容,而汇编和链接阶段则关注生成机器可以直接执行的代码。对于开发者来说,了解这些步骤可以帮助理解代码错误、优化程序性能以及调试复杂问题。此外,了解...

Global site tag (gtag.js) - Google Analytics