阅读本文大概需要 5.6 分钟

前言

在 Java 开发中,我们经常会提到 JVM。我们知道 JVM 是 Java 虚拟机,但是它的运行原理是什么?它的内存结构是什么?如何进行优化?如何去定位问题?面试中遇到 JVM 问题如何回答?

接下来我会开启 JVM 的章节,为大家一一解答上面的问题。现在就开启我们的 JVM 学习之路吧!

什么是 JVM?

面试官:什么是 JVM?

小李:JVM(Java Virtual Machine)是 Java 虚拟机,用于运行 Java 编译后的二进制字节码,最后生成机器指令。(心里一想,简简单单)

面试官:那为什么 Java 研发体系需要 JVM?你对 JVM 的运行原理了解多少?我们写的 Java 代码到底是如何运行起来的?

小李:嗯。。。就是。。。嗯。。。是那个。。。嗯。。。

面试官:面试就到这里了,先回去等通知吧。

小李:好的!(哭着回答)

img


这里面试官对小李进行三连问:

  1. 为什么 Java 研发体系需要 JVM?
  2. 你对 JVM 的运行原理了解多少?
  3. 我们写的 Java 代码到底是如何运行起来的?

这套组合拳看似很厉害,其实就是军体拳。

img

如果想完美的练这套军体拳,不,是完美的回答这三个问题,就需要首先要了解 JVM 是什么?它和 Java 是什么关系?又和 JDK 有什么渊源?那要弄清楚这些问题,就需要从三个维度去思考:

  • JVM 和操作系统的关系;
  • JVM 、JRE、JDK 的关系;
  • Java 虚拟机规范和 Java 语言规范的关系。

弄清楚这这几者的关系,我们再通过一个简单代码示例来看一个 Java 程序到底是如何执行的。

JVM 和 操作系统的关系

我们知道炼制一把牛逼的大宝剑,不仅需要上等的技术,还需要一鼎经百炼的剑炉。而工程师就相当于铸剑的剑师,JVM 便是剑炉。

img

JVM 就是我们耳熟能详的 Java 虚拟机。它能识别 .class 后缀文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

Java 程序和 C++ 程序有什么不同呢?这里用两张图进行说明。

imgimg

对比两张图可以看到 C++ 开发的程序可以翻译成操作系统能识别的 .exe 文件。而 Java 程序需要通过 javac 编译成 .class 文件之后,然后由 JVM 负责调用系统函数执行程序,操作系统并不认识 .class 文件。

那读者就劝小李了,转 C++ 开发吧,这 Java 还搞了一个处于程序和操作系统的虚拟机,不像 C++ 编译后直接在操作系统上运行,肯定不是啥好玩意。

img

我就知道你们坏的很,知道 JVM 的过人之处,还不告诉小李。那我给小李讲讲 JVM 的过人之处:

Java 是一门抽象度特别高的语言,提供了自动内存管理等一系列的特性。这些特性在操作系统上基本上是无望了,所以就需要 JVM 进行一番转换。

经过上面的介绍,我们可以做如下的类比:

  • JVM:等同于操作系统;
  • Java 字节码:等同于汇编语言。

Java 字节码还是比较容易读懂,从侧面上也证明了 Java 语言的抽象程度高。我们可以认为 JVM 是一个翻译器,会持续不断的翻译执行 Java 字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的。