Java程序编译&运行

编译

编译是将开发人员编写的Java源程序翻译成class文件,在这个过程中,javac编译器会检查我们编写的程序是否有错误,有错误就会提示出来
如果没有错误,代表编译成功,并产生字节码文件(.class)

运行

将编译的class文件交给JVM去执行,此时JVM就会执行我们编写的程序。
如下图所示

javacore和heapdump怎么生成 生成javacore文件_Java

注:当编写好的Java代码,编译成class文件后,再被JVM加载到内存中的时候是需要做字节码验证的。

  • 一个class文件被加载到JVM内存之后,首先要经过字节码验证,主要包含:
  1. 检查当前class文件的版本和JVM的版本是否兼容
  2. 检查当前代码是否会破坏系统的完整性
  3. 检查当前代码是否有栈溢出的情况
  4. 检查当前代码中的参数类型是否正确
  5. 检查当前代码中的类型转换操作是否正确
  • 验证通过后,在确定那些代码是解释执行的,那些代码是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程序运行流程

  1. 开发人员编写程序.java
  2. 编译后产生字节码文件.class
  3. 运行java 限定类名
  1. 启动JVM
  2. 启动启动类加载器,加载jre/lib/*.jar
  3. 启动拓展类加载器,加载jre/lib/ext/*.jar
  4. 启动应用类加载器加载开发人员写的jar/class文件
  5. 利用沙UN钢琴委托机制去加载这些class文件,如果说限定类名与jre/lib/*.jar或者jre/lib/ext/*.jar里面任何一个类相同,就不回家在自己写的
  6. 加载完成后进行字节码校验
  7. 校验通过后,热点代码直接执行,非热点代码通过JIT去解释一行就让CPU执行一行