JVM 系列 —— JVM 基础
这是 JVM 系列的第一篇,见 JVM 系列。
写在前面
最近想把之前学习 JVM 做的笔记整理一下,想写一个 JVM 的系列,主要包括以下部分:
- JVM 基础
- 类文件格式
- 类加载
- java 运行时数据区
- 对象
- JMM
- GC 基础知识
- GC 常用垃圾回收器
- GC 调优的问题
目的就是想复习一下知识点,然后巩固一下基础。很多东西不去用不去深入探究就会忘记。所以还是想再记录一下。
java 从编码到执行
首先,一个 java 文件从编码到运行的流程是一个怎样的流程,在 java 编程里面,我们最常用的命令就是 java
和 javac
,我们会先执行 javac 编译 .java
文件,通过编译器翻译成 java 字节码文件即 .class
文件,然后我们再通过 java
命令就可以让某个程序跑起来。所以这两个命令就代表了从编码到执行的两个过程,如下图:
对于 java
命令的操作,流程上是经过类加载器加载到内存(运行时数据区域)当中,然后再通过执行引擎(包括字节码解释器和 JIT(just in time)即时编译器)翻译成机器码,也就是操作系统指令集交给 CPU 去执行,这个过程中会调用到不同语言为 java提供的接口,即本地方法接口,native 接口。所以看起来 JVM 是个最低配的计算机系统。
jvm 是跨语言的平台,就是不同的操作系统对应不同的 jvm 版本,不同的操作系统的指令集和数据接口都有着差异,jvm 屏蔽了这样的差异细节,统一模拟成一个虚拟平台。java 是跨平台的语言,也就是说跟平台无关,只有 jvm 才与平台相关。
常见的 jvm 实现
jvm 是一种规范,不同的厂商,根据这个规范做出了不同的实现,我们常用的就是 oracle 的 Hotspot jvm。实际上还有其他厂商的实现:
- Hotspot
- J9 (IBM)
- Microsoft VM
- Taobao VM - hotspot 的深度定制版,修改了大量源码
- Azul zing - ZGC
JRE 和 JDK
用一张图来表示最直观和清晰:
JVM 系列 —— JVM 基础