节:JVM的整体结构
Posted 李阿昀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:JVM的整体结构相关的知识,希望对你有一定的参考价值。
这一讲,我们来看一下JVM的整体结构。
在为大家讲解JVM的整体结构之前,首先我们得引入这样一张图,如下所示。
关于以上这张图,大家在网上就能搜出来,应该这样讲,在有关JVM的一些书籍中这张图也会被频繁地使用到,所以大家在首次看到这张图时我相信内心应该还是比较有共鸣的。
以上这张图,不用我说大家也该知道它的重要性,而且光看没用,你还得会画,可能现在画起来多多少少有点困难,但是当大家学完内存与垃圾回收这一篇章的所有内容之后,相信大家应该能非常轻轻松松的就画出来了。
实际上,在下一章节当中我们还可以对该图进行一个细化,细化之后的图如下所示。
草啊!画这张图花了我快将近1个半小时,真是太耗精力了,大家且看且珍惜吧!
看到上面这张更加详细的图没,是不是比上面那张简图更加复杂啊!而且,各种细节是不是一目了然啊!现在,就不只是要求大家能画出上面那张简图了,你还得能够画出上面这张更加详细的图,做到胸有成竹、心中有图。
这里不用我说,大家也应该都知道,不管是最上面那张简图还是这张更加详细的图,它们描述的都是HotSpot虚拟机,关于HotSpot虚拟机,之前我在介绍Java在发展过程当中的一些重大事件时,就已经给大家提到过了,而且,不管是OracleJDK版本还是OpenJDK版本,HotSpot虚拟机都是它俩公用的虚拟机。
大家不妨再看一眼最上面那张简图,其实,这张简图就是HotSpot虚拟机的整体结构图,关于这张图,我得给大家好好唠唠。这里,我们可以按照从上到下的顺序将其分为上中下三层,如下图所示。
从上往下依次看,在上层我们能看到Java虚拟机就是来解释运行字节码文件的,关于这点我在前面已经反复地提到过了,大家应该还有印象吧!总之,Java虚拟机的入口原材料就是字节码文件,即Class File。
此外,在上层我们还能看到一个类装载器子系统,类装载器子系统的英文叫法是Class Loader Subsystem,当然,也有人叫它类加载器子系统。讲到类装载器子系统,那就不得不谈一下它的作用了,类装载器子系统的主要作用便是将字节码文件加载到内存当中,以生成一个大的Class对象。当然,在这一过程中,又会涉及到加载、链接以及初始化等步骤,其中链接又可以分为具体的三步,大家这里不知道并没有关系啊,等到下一章节我再来给大家进行详细讲解。
不知道大家有没有发现一点,就是内存与垃圾回收这一篇章我所安排的章节讲解顺序其实是按照Java虚拟机解释运行Java程序的顺序来的,如下所示便是内存与垃圾回收篇所罗列出来的所有章节,我就不信大家没看出来这点!
- JVM与Java体系架构
- 类加载子系统
- 运行时数据区概述及线程
- 程序计数器
- 虚拟机栈
- 本地方法接口
- 本地方法栈
- 堆
- 方法区
- 直接内存
- 执行引擎
- StringTable
- 垃圾回收概述
- 垃圾回收相关算法
- 垃圾回收相关概念
- 垃圾回收器
如果你真没看出来,那也没关系,这里我会直接给大家说清楚。首先,由于字节码文件需要被加载到内存当中,所以我们得了解类装载器子系统,然后,便是来了解清楚整个运行时数据区中具体的一些内存结构了,最后,则是来了解一下执行引擎,整个大致顺序就是这样。
看完上层,我们来看一下中间这一层,可以看到中间这一层是运行时数据区,运行时数据区的英文叫法是Runtime Data Area,这个大家知道一下就行。上面我已说过,字节码文件经过类装载器子系统以后会生成一个大的Class实例,其实,这个大的Class实例是生成在了方法区中。
而且,不难发现中间这一层运行时数据区又分成了好几个结构,其中就有:
- 方法区
- 堆
- 虚拟机栈
- 本地方法栈
- 程序计数器
注意,虚拟机栈以前也被叫做Java栈,而程序计数器大家称为PC寄存器也可行。
既然运行时数据区分成了以上好几个结构,那么我们肯定就是要搞清楚它们每一个结构的作用了,而且这也是我们后续学习的重头戏,所以大家一定要加倍认真的学,当然,我也会给大家进行详细讲解,毕竟这部分的内容可是非常重要的。
此外,从上图中还可以看到,方法区和堆这两块的颜色是一致的,之所以这样,是因为我想给大家着重强调一点,就是在内存当中方法区和堆是多个线程所共享的,但对于虚拟机栈、本地方法栈以及程序计数器来讲,它们是每个线程所独有的。
看完中层,我们再来看一下最后一层,可以看到这一层有一个执行引擎,关于这个执行引擎,从上图中我们是看不出它内部的结构的,只有从那张更加详细的图中我们才能看出来执行引擎的内部结构,执行引擎的内部结构包含有以下这三部分内容。
- 解释器
- JIT即时编译器
- 垃圾回收器
我们知道,字节码文件被加载到内存中以后,下一步便是解释运行了,而解释运行就要用到解释器,但是只用解释器的话,程序的整体运行体验会感觉稍微差一些,因为对于那些反复执行的热点代码,我们是希望能够将其给提前编译出来的,所以这里又会用到一个JIT即时编译器。
看到这里,有童鞋肯定就想问了,.java
源文件生成.class
字节码文件时,用到了一个编译器,而现在这儿又用到了一个编译器,怎么回事啊?其实,之前我就已说过,编译器是有两端的,.java
源文件生成.class
字节码文件时所用的编译器是前端编译器,而现在这儿用到的JIT即时编译器则是后端编译器。
至于垃圾回收器,相信不用我说,大家也应该知道垃圾的自动回收就是借助于垃圾回收器而实现的。
了解执行引擎的内部结构之后,大家可能还是会比较迷糊,因为不知道它主要是用来干什么的,不知道也没关系啊,因为下面我会给大家来简单说说。
相信大家应该都知道操作系统实际上是只能够识别机器指令的,但令人忧烦的是字节码指令又不等同于机器指令,这样,要想让字节码文件能够被解释执行,那就只得借助于执行引擎了。其实,执行引擎就充当了这样一个角色,即一个将高级语言翻译成机器语言的翻译者。
总之,执行引擎是Java虚拟机当中最重要的结构之一,注意,这里我说的可是之一,因为Java虚拟机里面的每一个结构其实都非常重要。
以上我就给大家解释完了Java虚拟机当中的每一层结构,当然,大家现在只需要朦朦胧胧知道每一部分结构的基本作用是什么就行了,后续更加详细的内容我会给大家慢慢展开。
最后,大家再搂一眼内存与垃圾回收这一篇章我所安排的章节讲解顺序。
现在,大家的脑海中应该慢慢开始有了一个JVM的整体结构图了吧!
以上是关于节:JVM的整体结构的主要内容,如果未能解决你的问题,请参考以下文章