扫盲贴:Java程序执行流程

使用java编程的朋友,通过IDE执行程序,或者把项目打包成war包或者jar包然后放到tomcat或者jetty上面执行。可能对从编译到解释执行的流程不是那么地了解。那么请读下这篇文章,帮助大家梳理整个java程序的执行流程:

可见一般java程序从程序编写在操作系统中执行,需要通过编译器把.java格式的源文件编译成字节码的.class文件,使用过命令行操作的朋友知道这部通过javac进行编译。这个字节码文件与平台无关。

接下来我们会通过java命令,进行程序运行,过程就是java生成JVM实例,把字节码文件通过类加载器加载进JVM中,然后进行字节码的校验,没有问题就通过解析器把字节码翻译成当前机器能识别的机器码。然后交给操作系统去进行调度执行。

一、编译阶段

在java编译器进行源代码翻译成字节码的过程,是分成四个子过程的。

1、词法分析

这个阶段重要是把读取源文件的字符流,转成一个个“单词”。

2、语法分析

这阶段把上一阶段生成的词法单元流(单词)组成一个个语法单元,类似我们把英语句子中的单词组成一个个短语。最后构成一个语法树。

3、语义分析

   分析语法树的执行流程是否正确,这点类似我们把各个短语拼成句子,然后分析整个句子是否正确。也许单个短语是没问题的,但是组成句子就会出现含义的错误。

4、翻译成字节码

   以上三步都没有问题,那么就使用字节码生成器把语法树翻译成字节码。

以上四个过程环环相扣,如果有一个地方出问题,就会导致编译出错。

二、JVM运行阶段

通过编译后得到字节码文件,与平台(Windows、linux..)无关。但是特定平台的机器只能执行其相应的机器码。那么就需要有一个中间组件来对把字节码翻译成对应的平台的机器码,这个就是解析器,而解析器是在JVM里面的。解析器是一句一句代码进行解析的。

JVM的执行流程:

1、JVM使用类加载器(Class Loader)装载 class 文件

2、字节码效验(主要做以下五步)

      检查当前class文件的版本和JVM的版本是否兼容

     检查当前代码是会破坏系统的完整性

     检查当前代码是否有栈溢出的情况

     检查当前代码中的参数类型是否正确

     检查当前代码中的类型转换操作是否正确

3、把通过校验的字节码解析成机器码,解析器是一句句进行代码进行解析的。

三、JIT(Just In Time)

Hotspot 虚拟机 提供了 JIT(Just In Time),也就是我们通常所说的动态编译器, 它能够在运行时将热点代码(经常被访问的代码)编译为机器码,这个时候字节码就变成了编译执行。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值