Java 代码有很多种不同的运行方式,可以在开发工具种运行;可以双击执行 jar 文件运行;可以在命令行种运行;甚至可以在网页种运行,这些都离不开 JRE,也就是 Java运行环境。(包含 Java 程序的必须组件,即 Java 虚拟机以及 Java 核心类库等)
为什么 Java 要在虚拟机里运行?
Java 的语法很复杂,抽象程度高,直接在硬件上运行这种复杂的程序并不现实,所以在在运行之前需要进行转换。为了完成转换,会设计一个面向 Java 语言特性的虚拟机,并通过编译器将Java程序转换成虚拟机能识别的指令序列,也称 Java 字节码,之所以这么取名是因为 Java 字节码指令的操作码(opcode)被固定为一个字节。
虚拟机可以由硬件实现,但更为常见的是在现有平台上提供软件实现。这么做的意义在于:一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的同版本虚拟机里运行,也就是 “一次编译,处处运行”
虚拟机的另外一个好处就是它带来了一个托管环境。能够代替我们处理一些代码种冗长容易出错的部分,最常见的就是自动内存管理与垃圾回收。另外,托管环境还提供了如数组越界,动态类型、安全权限等的动态检测,使我们免于书写与无关业务逻辑的代码
Java 虚拟机具体是怎样运行 Java 字节码的?
以标准 JDK 中的 HotSpot 虚拟机为例,从虚拟机底层和硬件两个角度来看 Java 字节码的运行。
从虚拟机底层来说,执行 Java 代码需要先将它编译成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被u存放于