Java代码是怎样运行的?

java代码有很多种运行方式,可以在开发工具中运行,可以通过双击jar包运行,可以在命令行中运行,甚至可以在网页中运行,这些运行方式都离不开JRE,也就是java运行时环境

JRE是java runtime environment的缩写,其中包含java运行时所需要的必要组件,包括java虚拟机、java核心类库。java程序员经常使用的JDK(java development kit)中同样包含了JRE,并且还附带了一系列的开发、诊断工具

我们知道想要让计算机运行程序,常常是需要将我们编写的高级代码编译成机器码。机器码是跟硬件息息相关的,在不同的平台(cpu和操作系统)上,同一代码编译出来的文件是截然不同的。

java为了实现跨平台,采用的是虚拟机的方式。也就是在平台和java代码之间添加了一层,让java程序运行在java虚拟机中,并在不同的平台上实现各自的虚拟机。这样我们的java代码和底层的平台就解耦了。

实际上java虚拟机运行的并不是java代码,而是一种介于java代码和机器码之间的字节码。这种字节码可以通过javac编译java代码而来。这也是为什么java虚拟机不仅可以运行java程序,还可以运行kotlin、scala等,因为这些语言都可以将自身的代码编译成字节码,从而交给虚拟机来运行。

虚拟机引入的另外一个好处是它带来了一个托管环境(Managed Runtime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。其中最广为人知的当属自动内存管理与垃圾回收。

那么,我们java程序运行的整个流程是什么样呢?

首先我们程序员编写.java文件,通过javac前端编译器来讲.java文件编译成虚拟机可读的.class字节码文件。之后通过虚拟机的类加载机制,将我们的字节码文件读入到虚拟机内存当中。之后虚拟机的字节码执行引擎通过解释器+即时编译器相结合的方式运行我们的java程序。