深入拆解Java虚拟机(一)
1. 为什么 Java 需要运行时环境 1.1. Java 程序的启动方式 IDE中启动,比如:Eclipse、IntelliJ IDEA 构建为 jar,通过命令行的方式启动,比如:java -jar application.jar 使用构建工具(如:Gradle、Maven)启动,比如 SpringBoot 应用启动:gradle bootRun、mvn spring-boot:run 1.2. JRE 是什么 在这里引用极客时间课程Java核心技术面试精讲中的一段话 我们日常会接触到 JRE(Java Runtime Environment) 或者 JDK(Java Development Kit)。JRE,也就是 Java 运行时环境,仅包含运行 Java 程序的必须组件,包括 Java 虚拟机以及 Java 核心类库等。而 JDK 可以看作是 JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。 1.3. 为什么需要运行时环境 不是有这么一句话么,计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。话说回来,Java 代码运行之所以需要运行时环境,主要是由于以下几个方面的原因: Java 语言语法非常复杂,抽象程度高,直接在硬件上运行这种复杂的程序并不现实(并不是不可以,但是这样造成与相应硬件的强耦合,且不便于抽象和复杂语法的实现。),所以需要在运行之前进行一番转换。 实现平台无关性、做到 “Write once, run anywhere”,获得跨平台的能力。这样便需要一个中间层进行解耦,达到上层统一编码、下层跨越平台、中间实现兼容(所以,Java 语言的跨平台特性是由 Java 运行时环境实现的。也就是在不同平台皆有与之相对应的 Java 运行时环境,实现相同定义、不同实现。这样的思想是不是很熟悉,当然,这仅是我的理解)。 提供托管环境(Managed Runtime),该托管环境可以代替我们处理一些通用的、容易出错的、高难度的行为,比如自动内存管理、垃圾回收、安全权限动态检测等。 2. Java 代码在虚拟机中是怎样运行的 2.1. 虚拟机视角 执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中,加载后的 Java 类会被存放到方法区中。实际运行时,虚拟机会执行方法区内的代码(需要将字节码翻译为机器码,在 HotSpot 实现中,有解释执行和即时编译两种)。...