1 JVM 从编译到执行
首先给出基于JDK8的JAVA SE产品组件,里面包含了JDK,JRE,JVM三者之间的关系:
JVM
:Java Virtual Machine,可运行 Java 代码的抽象计算机,包括一套字节码指令集
、一组寄存器
、一个栈
、 一个垃圾回收
,堆
和一个存储方法域
。JVM 是运行在操作系统之上的,它与硬件没有直接的交互
。
JRE
:Java Runtime Environment,除了包含 JVM
之外,提供了很多的类库
(就是我们说的 jar 包,它可以提供一些即插即用的功能,比如读取或者操作文件,连接网络,使用 I/O
等等之类的),这些东西就是 JRE
提供的基础类库
。
JDK
:Java Development Kits,包含JRE
,还有一些非常好用的小工具,比如 javac
(编译代码)、java
、jar
(打包代码)、javap
(反编译<反汇编>)等。
1.1 Java 程序的执行过程
一个 Java 程序,首先经过 javac
编译成 .class 文件
,然后 JVM 将其加载到方法区
,执行引擎将会执行这些字节码
。执行时,会翻译成操作系统相关的函数。JVM 作为 .class 文件
的翻译存在,输入字节码,调用操作系统函数。
过程如下:Java 文件
-> 编译器
-> 字节码
-> JVM
-> 机器码
。
1.2 从跨平台到跨语言
跨平台:我们写的一个类,在不同的操作系统上(Linux、Windows、MacOS 等平台)执行,效果是一样,这个就是 JVM 的跨平台性
。 为了实现跨平台型,不同操作系统有对应的 JDK 的版本。
跨语言(语言无关性):JVM 只识别字节码
,所以 JVM 其实跟语言是解耦
的,也就是没有直接关联,JVM 运行不是翻译 Java 文件
,而是识别 class 文件
,这个一般称之为字节码
。还有像 Groovy
、Kotlin
、Scala
等等语言,它们其实也是编译成字节码,所以它们也可以在 JVM 上面跑,这个就是 JVM 的跨语言
特征。Java 的跨语言性一定程度上奠定了非常强大的 java 语言生态圈。
2 JVM 的发展
常见的 JVM:
3 JVM 整体知识模块
JVM 能涉及非常庞大的一块知识体系,比如内存结构
、垃圾回收
、类加载
、性能调优
、JVM 自身优化技术
、执行引擎
、类文件结构
、监控工具
等。 但是在所有的知识体系中,都或多或少跟内存结构
有一定的关系: 比如垃圾回收
回收的就是内存、类加载
加载到的地方也是内存、性能优化
也涉及到内存优化、执行引擎
与内存密不可分、类文件结构
与内存的设计有关系,监控工具
也会监控内存。所以内存结构
处于 JVM 中核心位置
。也是属于我们入门 JVM 学习的最好的选择。
同时 JVM 是一个虚拟化的操作系统,所以除了要虚拟指令
之外,最重要的一个事情就是需要虚拟化内存
,这个虚拟化内存就是我们马上要讲到的 JVM 的内存区域
。下章见分晓。