一、了解 JVM
一、JVM 和操作系统的关系
-
JVM 全称 Java Virtual Machine,就是 Java 虚拟机。
-
它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。
-
一般情况下,使用 C++ 开发的程序,编译成二进制文件后,就可以直接执行了,操作系统能够识别它;
-
但是 Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。
-
Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太可能的,所以就需要 JVM 进行一番转换。
-
类比一下:
- JVM:等同于操作系统;
- Java 字节码:等同于汇编语言。
-
Java 字节码一般都比较容易读懂,从侧面上证明 Java 语言的抽象程度比较高。
-
可以把 JVM 认为是一个翻译器,会持续不断的翻译执行 Java 字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的。
-
如上图所示,有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。
-
JVM 只需要保证能够正确执行 .class 文件,就可以运行在诸如 Linux、Windows、MacOS 等平台上了。
-
Java 跨平台的意义在于一次编译,处处运行,能够做到这一点 JVM 功不可没。比如在 Maven 仓库下载同一版本的 jar 包就可以到处运行,不需要在每个平台上再编译一次。
-
概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。
二、JVM、JRE、JDK 的关系
- JVM 是 Java 程序能够运行的核心。但是 JVM 自己什么也干不了,需要给它提供生产原料(.class 文件)。
- 仅仅是 JVM,是无法完成一次编译,处处运行的。它需要一个基本的类库,比如怎么操作文件、怎么连接网络等。
- 而 Java 体系很慷慨,会一次性将 JVM 运行所需的类库都传递给它。
- JVM 标准加上实现的一大堆基础类库,就组成了 Java 的运行时环境,也就是的 JRE(Java Runtime Environment)。
- 有了 JRE 之后,Java 程序便可以在浏览器中运行了。
- 对于 JDK 来说,就更庞大了一些。除了 JRE,JDK 还提供了一些非常好用的小工具,比如 javac、java、jar 等。它是 Java 开发的核心。
- JDK > JRE > JVM
三、Java 虚拟机规范和 Java 语言规范的关系
-
JVM 除了垃圾回收器,还有很多部分,比如对字节码进行解析的执行引擎等。
-
广义上来讲,JVM 是一种规范,它是最为官方、最为准确的文档;
-
狭义上来讲,由于开发中使用 Hotspot 更多一些,所以一般在谈到这个概念时,会将它们等同起来。
-
上图中左半部分是 Java 虚拟机规范,其实就是为输入和执行字节码提供一个运行环境。
-
右半部分是 Java 语法规范,比如 switch、for、泛型、lambda 等相关的程序,最终都会编译成字节码。
-
而连接左右两部分的桥梁依然是 Java 的字节码。
-
如果 .class 文件的规格是不变的,这两部分是可以独立进行优化的。但 Java 也会偶尔扩充一下 .class 文件的格式,增加一些字节码指令,以便支持更多的特性。
-
可以把 Java 虚拟机可以看作是一台抽象的计算机,它有自己的指令集以及各种运行时内存区域。