Java程序编译&运行
编译
编译是将开发人员编写的Java源程序翻译成class文件,在这个过程中,javac编译器会检查我们编写的程序是否有错误,有错误就会提示出来
如果没有错误,代表编译成功,并产生字节码文件(.class)
运行
将编译的class文件交给JVM去执行,此时JVM就会执行我们编写的程序。
如下图所示
注:当编写好的Java代码,编译成class文件后,再被JVM加载到内存中的时候是需要做字节码验证的。
- 一个class文件被加载到JVM内存之后,首先要经过字节码验证,主要包含:
- 检查当前class文件的版本和JVM的版本是否兼容
- 检查当前代码是否会破坏系统的完整性
- 检查当前代码是否有栈溢出的情况
- 检查当前代码中的参数类型是否正确
- 检查当前代码中的类型转换操作是否正确
- 验证通过后,在确定那些代码是
解释执行
的,那些代码是JIT即时编译
执行的
- 解释执行
class文件内容,需要让JVM进行解释,解释称计算机可以执行的代码。整体效果就是JVM解释一行代码就执行一行代码。所以如果Java代码全是这样运行的话效率会很低。 - JIT即时编译
执行代码的另一种方式,JVM可以吧Java中的热点代码
直接编译成计算机可以运行的代码,这样接下来在调用到这个热点代码的时候,就可以直接使用编译好的代码让计算机直接运行,可以提高运行效率。
综上,当前的HotSpot虚拟机就是结合了解释执行和JIT即时编译的。
类需要注意的点
- 一个Java文件只能有一个
public class
- 如果写了
public class
,类的名字和文件名字要保持一致 - 一个Java可以出现多个class,但是class的名字不能重复
main方法
main方法,称为主方法,写法固定,如果想要写一个主方法,格式必须是public static void main(String[] args){}
main方法是一个程序的入口,无论编写多少程序,JVM在运行的时候都会从mian方法开始执行
如果没有这个固定的入口,JVM就没办法运行我们编写的代码
Java程序运行流程
- 开发人员编写程序.java
- 编译后产生字节码文件.class
- 运行
java 限定类名
- 启动JVM
- 启动启动类加载器,加载
jre/lib/*.jar
- 启动拓展类加载器,加载
jre/lib/ext/*.jar
- 启动应用类加载器加载开发人员写的jar/class文件
- 利用沙UN钢琴委托机制去加载这些class文件,如果说限定类名与
jre/lib/*.jar
或者jre/lib/ext/*.jar
里面任何一个类相同,就不回家在自己写的 - 加载完成后进行字节码校验
- 校验通过后,热点代码直接执行,非热点代码通过JIT去解释一行就让CPU执行一行