持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天。
运行过程
Java 程序的运行,要经过编译和运行两个步骤。首先将后缀为 .java 的文件进行编译生成后缀为 .class 的字节码文件,然后 Java 虚拟机会将字节码文件进行解释执行并显示结果。
其中 Java 虚拟机会将编译好的字节码文件加载到内存,这个过程被称为类加载,它是由类加载器完成的,然后虚拟机针对加载到内存中的Java类进行解释执行,便可看到运行结果。
类加载过程主要涉及JVM的方法区,方法区存储了类的类型信息,如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。这些都可以看作静态信息,每次方法被调用,在java栈中保持该方法的临时变量,当方法返回时,java栈自动撤消。JVM将类加载过程分成加载,连接,初始化三个阶段,其中连接阶段又细分为验证,准备,解析三个阶段。
注:有些 IDE 配置后点击运行并不会明显生成 .class 文件,而是直接打印结果,比如 配置好的 VScode。
Java 的跨平台解释
由上可知,Java 程序是由虚拟机进行解释执行的,而不是操作系统,这样做的目的就是很好的实现了跨平台性,即针对不同的操作系统我们只需编写一套代码就可以了,但是前提是要安装不同版本的虚拟机。这样便可实现“一次编写,到处执行”。
知识拓展
解释型语言与编译型语言的区别:
- 解释型语言
通过解释器执行程序,不需要编译过程按照语法规则进行解释,如 JS、python、ruby、perl等语言。
- 编译型语言
首先要把程序编译为机器能识别的机器码,再进行编译。