学习 JVM 的原因
JVM -- Java Virtual Machine,Java 虚拟机是一个虚拟的体系,它拥有目前最前沿的垃圾回收算法实现。虽然 JVM 也有一些局限性,但学习它之后,在遇到其他基于“虚拟机”的语言时,便能够融会贯通。
对 Java 高级工程师来说,JVM 是必须掌握的技能点。
在面试和求职过程中,经常会遇到 JVM 相关的知识。
JVM 的功能
JVM 和操作系统
使用 C++ 开发的程序,编译成二进制文件后,就可以直接执行了,因为操作系统能够识别它。但是,使用
javac
编译 Java 程序成为.class
文件后,还需要 Java 虚拟机识别.class
后缀的文件,并且解析它的指令,然后才会被操作系统识别从而能调用操作系统上的函数。JVM 解释的是类似于汇编语言的字节码,需要一个抽象的运行时环境。同时,这个虚拟环境也需要解决字节码加载、自动垃圾回收、并发等一系列问题。
“JVM” 像是 “操作系统”;“Java 字节码” 像是 “汇编语言”。
Java 底层虽然比 C++ 要复杂,但因为有了 JVM 这个抽象层之后,起到了跨平台的作用,即 “一次编译,处处运行”。
在 Maven 仓库下载同一版本的 jar 包就可以到处运行,不需要在每个平台上再编译一次。
JVM 的扩展语言,比如
Clojure
、JRuby
、Groovy
等,编译到最后都是.class
文件,Java 语言的维护者,只需要控制好 JVM 这个解析器,就可以将这些扩展语言无缝的运行在 JVM 之上了。
对比 C++ 和 Java 的生产加载过程
JVM 和 JRE、JDK
JRE -- Java Runtime Environment,Java 的运行时环境 = JVM 标准 + 基础类库
JDK -- Java Development Kit,Java 开发工具包 = JRE + 开发工具
JVM 规范和 Java 语言规范
The Java Virtual Machine Specification
-- JVM 规范:定义了 .class 文件的结构、加载机制、数据存储、运行时栈等诸多内容,最常用的 JVM 规范实现就是Hotspot VM
。The Java Language Specification
-- Java 语言规范:定义 Java 语法规范,比如 switch、for、泛型、lambda 等。两个规范通过 Java 的字节码连接在一起,因为 Java 程序最终都会编译成字节码。
Java 程序的执行过程
Java 程序是文本格式的。比如下面的
HelloWorld.java
,它遵循的就是 Java 语言规范。其中,它调用了System.out
等模块,也就是 JRE 里提供的类库。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}