vlambda博客
学习文章列表

面试灵魂拷问:你对 JVM 的运行原理了解多少?

本文选自拉勾教育专栏:《深入浅出 Java 虚拟机》


你好,我是李国,今天要给大家分享的是 JVM 的学习。如果你是一名软件开发工程师,在日常工作中除了 Java 这个关键词外,还有一个名词也一定经常被提及,那就是 JVM 。提到 JVM 我们经常会在面试中遇到这样的问题:


  • 为什么 Java 研发系统需要 JVM?

  • 对 JVM 的运行原理了解多少?

  • 我们写的 Java 代码到底是如何运行起来的?


想要弄清楚这些问题,我们接下来从这三个维度去探讨:


  • JVM 和操作系统的关系?

  • JVM、JRE 、JDK的关系?

  • JVM 虚拟机规范和 Java 语言规范的关系?


JVM 和操作系统的关系

       

我们用一句话概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。


而 Java 程序和我们通常使用的 C++ 程序有什么不同呢?这里用两张图进行说明。

       面试灵魂拷问:你对 JVM 的运行原理了解多少?              面试灵魂拷问:你对 JVM 的运行原理了解多少?       

对比这两张图可以看到 C++ 程序是编译成操作系统能够识别的 .exe 文件,而 Java 程序是编译成 JVM 能够识别的 .class 文件,然后由 JVM 负责调用系统函数执行程序。


JVM、JRE、JDK的关系

       面试灵魂拷问:你对 JVM 的运行原理了解多少?      

通过上面的学习我们了解到 JVM 是 Java 程序能够运行的核心。但是需要注意,JVM 自己什么也干不了,你需要给它提供生产原料(.class 文件)。俗语说的好,巧妇难为无米之炊。它虽然功能强大,但仍需要为它提供 .class 文件。


仅仅是 JVM,是无法完成一次编译,处处运行的。它需要一个基本的类库,比如怎么操作文件、怎么连接网络等。而 Java 体系很慷慨,会一次性将 JVM 运行所需的类库都传递给它。JVM 标准加上实现的一大堆基础类库,就组成了 Java 的运行时环境,也就是我们常说的 JRE(Java Runtime Environment)。


有了 JRE 之后,我们的 Java 程序便可以在浏览器中运行了。大家可以看一下自己装的 Java 目录,如果是只需要执行一些 Java 程序,只需要一个 JRE 就足够了。


对于 JDK 来说,就更庞大了一些。除了 JRE,JDK 还提供了一些非常好用的小工具,比如 javac、java、jar 等。它是 Java 开发的核心,让外行也可以炼剑!


我们也可以看下 JDK 的全拼,Java Development Kit 。我非常怕 kit(装备)这个单词,它就像一个无底洞,预示着你永无休止的对它进行研究。JVM、JRE、JDK 它们三者之间的关系,可以用一个包含关系表示。


JDK>JRE>JVM


       面试灵魂拷问:你对 JVM 的运行原理了解多少?      


JVM 虚拟机规范和 Java 语言规范的关系


我们通常谈到 JVM ,首先会想到它的垃圾回收器,其实它还有很多部分,比如对字节码进行解析的执行引擎等。广义上来讲,JVM 是一种规范,它是最为官方、最为准确的文档;狭义上来讲,由于我们使用 Hotspot 更多一些,我们一般在谈到这个概念时,会将它们等同起来。


如果再加上我们平常使用的 Java 语言的话,可以得出下面这样一张图。这是 Java 开发人员必须要搞懂的两个规范。

              


左半部分是 Java 虚拟机规范,其实就是为输入和执行字节码提供一个运行环境。右半部分是我们常说的 Java 语法规范,比如 switch、for、泛型、lambda 等相关的程序,最终都会编译成字节码。而连接左右两部分的桥梁依然是 Java 的字节码。


如果 .class 文件的规格是不变的,这两部分是可以独立进行优化的。但 Java 也会偶尔扩充一下 .class 文件的格式,增加一些字节码指令,以便支持更多的特性。


我们可以把 Java 虚拟机可以看作是一台抽象的计算机,它有自己的指令集以及各种运行时内存区域,学过《计算机组成结构》的同学会在课程的后面看到非常多的相似性。


那有的同学就说了,我不学习 JVM ,会影响我写 Java 代码么?理论上,这两者没有什么必然的联系。它们之间通过 .class 文件进行交互,即使你不了解 JVM,也能够写大多数的 Java 代码。就像是你写 C++ 代码一样,并不需要特别深入的了解操作系统的底层是如何实现的。


但是,如果你想要写一些比较精巧、效率比较高的代码,就需要了解一些执行层面的知识了。了解 JVM,主要用在调优以及故障排查上面,你会对运行中的各种资源分配,有一个比较全面的掌控。


小结


搞懂这些,我们再回头看上面的三个问题,自然迎刃而解了。


  • 为什么 Java 研发系统需要 JVM?


JVM 解释的是类似于汇编语言的字节码,需要一个抽象的运行时环境。同时,这个虚拟环境也需要解决字节码加载、自动垃圾回收、并发等一系列问题。JVM 其实是一个规范,定义了 .class 文件的结构、加载机制、数据存储、运行时栈等诸多内容,最常用的 JVM 实现就是Hotspot。


  • 对你 JVM 的运行原理了解多少?


JVM 的生命周期是和 Java 程序的运行一样的,当程序运行结束,JVM 实例也跟着消失了。JVM 处于整个体系中的核心位置,关于其具体运行原理,我们在下面的分享中详细介绍。


  • 我们写的 Java 代码到底是如何运行起来的? 


一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到`元数据`区,执行引擎将会通过`混合模式`执行这些字节码。执行时,会翻译成操作系统相关的函数。JVM 作为 .class 文件的黑盒存在,输入字节码,调用操作系统函数。过程如下:Java 文件->编译器>字节码->JVM->机器码。


总结


到这里本次分享的内容就全部讲完了,今天我们分别从三个角度,了解了 JVM 在 Java 研发体系中的位置。


下一次分享我将分享关于 JVM 内存管理相关的知识,记得持续关注 IT 技术思维哦。


版权声明:本文版权归属拉勾教育及该专栏作者,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者必究。


“阅读原文”查看 深入浅出 Java 虚拟机