JVM 系列 —— JVM 基础

这是 JVM 系列的第一篇,见 JVM 系列

写在前面

最近想把之前学习 JVM 做的笔记整理一下,想写一个 JVM 的系列,主要包括以下部分:

  • JVM 基础
  • 类文件格式
  • 类加载
  • java 运行时数据区
  • 对象
  • JMM
  • GC 基础知识
  • GC 常用垃圾回收器
  • GC 调优的问题

目的就是想复习一下知识点,然后巩固一下基础。很多东西不去用不去深入探究就会忘记。所以还是想再记录一下。

java 从编码到执行

首先,一个 java 文件从编码到运行的流程是一个怎样的流程,在 java 编程里面,我们最常用的命令就是 javajavac,我们会先执行 javac 编译 .java 文件,通过编译器翻译成 java 字节码文件即 .class 文件,然后我们再通过 java 命令就可以让某个程序跑起来。所以这两个命令就代表了从编码到执行的两个过程,如下图:

javac 命令操作

对于 java 命令的操作,流程上是经过类加载器加载到内存(运行时数据区域)当中,然后再通过执行引擎(包括字节码解释器和 JIT(just in time)即时编译器)翻译成机器码,也就是操作系统指令集交给 CPU 去执行,这个过程中会调用到不同语言为 java提供的接口,即本地方法接口,native 接口。所以看起来 JVM 是个最低配的计算机系统。

jvm 组成

jvm 是跨语言的平台,就是不同的操作系统对应不同的 jvm 版本,不同的操作系统的指令集和数据接口都有着差异,jvm 屏蔽了这样的差异细节,统一模拟成一个虚拟平台。java 是跨平台的语言,也就是说跟平台无关,只有 jvm 才与平台相关。

常见的 jvm 实现

jvm 是一种规范,不同的厂商,根据这个规范做出了不同的实现,我们常用的就是 oracle 的 Hotspot jvm。实际上还有其他厂商的实现:

JRE 和 JDK

用一张图来表示最直观和清晰:

jre 和 jdk 的关系

作者

操先森

发布于

2021-10-29

更新于

2021-11-11

许可协议

评论