1 运行环境
作为一名 Java 程序员,你应该知道,Java 代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页中运行。当然,这些执行方式都离不开 JRE,也就是 Java运行时环境。
实际上,JRE 仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。
2 运行流程首先我们需要并通过编译器将Java源代码,即.java文件编译为.class文件。.class文件中包含Java字节码以及类数据结构信息。JAVA虚拟机能够以正确方式读取class文件中的每一条字节码指令,并按照要求实现Java字节码的功能。
执行Java代码首先需要将它编译而成的class文件通过类加载器加载到Java虚拟机中。加载后的Java类信息会被存放于方法区(MethodArea)中。实际运行时,虚拟机会执行方法区内的JAVA字节码。由于JVM是运行在操作系统之上的,Java字节码无法直接执行。因此Java 虚拟机需要将字节码翻译成机器码,在通过操作系统转换为指令集调用底层硬件服务执行。在HotSpot 里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。
3 JAVA虚拟机从上图可以发现Java是运行在JVM之上的。但是Java语言和JVM没有必然的联系。Java语言并不是只能运行在JVM之上,例如Java可以被编译为本地代码直接运行在操作系统之上,比如,Linux上的GCJ(GNU Compiler for Java)就可以把Java语言编译为本地代码直接执行。
同样的,JVM上也不是只能执行Java语言,只要实现了适当的编译器,将其他语言编译为JVM上的字节码,就可以在JVM上运行。比如,JRuby,Jython以及Groovy等其他JVM语言,都会通过相应的编译器或是解释器转化为.class,然后再JVM上运行。
既然可以直接将JAVA语言直接编译到操作系统上运行。为什么 Java 要在虚拟机中运行呢
虚拟机的好处Java 虚拟机可以由硬件实现,但更为常见的是在各个现有平台(如 Windows_x64、Linux_aarch64)上提供软件实现。这么做的意义在于,一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。这也就是我们经常说的“一次编写,到处运行”。虚拟机的另外一个好处是它带来了一个托管环境(Managed Runtime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。其中最广为人知的当属自动内存管理与垃圾回收,这部分内容甚至催生了一波垃圾回收调优的业务。
除此之外,托管环境还提供了诸如数组越界、动态类型、安全权限等等的动态检测,使我们免于书写这些无关业务逻辑的代码。