首页 > JVM的体系结构概述—JVM系列01
头像
猿兄
发布于 2020-12-25 19:07
+ 关注

JVM的体系结构概述—JVM系列01

JVM的体系结构概述

一、JVM位置

首先因为 JVM 的体系结构其实与 JVM 所在位置有一定关系,所以我们要知道 JVM 的位置。

硬件之上是操作系统,操作系统之上才是 JVM ,所以JVM 与硬件没有直接的交互。

二、JVM 的体系结构有哪些部分

我们先来粗略的说一下一个程序从编写到执行的过程。 当我们编写了一个 Java 程序,也就是一个以 .java 为后缀的源文件,比如 HelloWorld.java 。 我们去点击编译运行 ,其中,编译是通过编译器将 .java 源代码文件 编译成 .class 二进制字节码文件,然后这个 .class 文件会被加载进一个运行时的区域,再通过一个执行引擎解释 .class 中的命令,最后交由给操作系统执行。

通过上面这个流程,我们大概知道了,JVM 的体系结构中需要有一个类加载器,然后还需要一个运行时的区域,并且还需要一个执行引擎

通过分析之后,初步得到结构图:
 

但这只是初步分析之后得到的结构图,肯定还有些不完善的地方,我们接着来分析并完善。

我们知道,Java 不能直接操作硬件系统,而 C/C++ 等一些语言可以操作硬件系统,而如果我们的程序中需要操作硬件系统,那我们就需要调用 C/C++ 程序来操作。而不同语言间的调用,一般是使用提供好的接口,通过这些接口去调用其他语言的方法库。在Java中,将这些 C/C++ 程序的方法,称为本地方法。

那么我们知道,我们的 JVM 体系结构中,还需要可以通过 本地方法接口 从而去调用本地方法库中的方法。

进一步分析后的结构图:
 

恭喜!通过我们一步步的分析,JVM 体系结构的整体结构就分析出来了。

下一步,我们再来深入思考分析来细化一下结构图。

从上面的分析和得出的结构图中,我们可以知道类加载器会把 .class 加载进运行时数据区,然后再由执行引擎解释其中的命令并交由操作系统执行。那么思考一下,这个运行时数据区需要什么东西?

  1. 首先,当一个虚拟机启动时,我们内存区域中肯定要准备一块地方来存放对象实列,而不同的线程都需要去创建对象实例,并且可能需要操作其他线程创建的实列,所以这个内存区域需要是线程共享的。这个区域我们可以称之为 所以,我们的 JVM 体系结构中还需要一个线程共享的

  2. 有了内存区域存储对象实列,那么类的结构信息,常量,静态变量,等一些其他信息,我们是不是也应该有一个内存区域来存放?并且,对于,类的结构信息,常量,静态变量 等这些信息,多个线程肯定都是需要用到的,但如果单独给每个线程都准备这么一个内存区域来存放这些信息的话,那就太浪费了。因为这些信息,不管哪个线程来访问都是一样的,那么这个内存区域应该设置成线程共享的。这个区域,我们可以称为方法区 所以,我们的JVM 体系结构中还需要一个线程共享的 方法区

  3. 我们一个 Java 程序里面可能有很多语句,也就是有很多指令(指令),这些语句由执行引擎去读取解释并交由操作系统运行,那么执行引擎怎么知道该读取那一条指令呢?执行引擎只负责读取并解释命令,并不知道该读取哪一条指令。所以我们要将该执行的指令告诉执行引擎 而有一个东西叫做PC寄存器,或者叫做程序计数器,它可以用来记录当前线程所执行的字节码的行号。然后通过这个程序计数器执行引擎就知道该执行哪条指令了。 所以,我们的 JVM 体系结构中还需要一个程序计数器

  4. 一个 Java 程序运行之后,可以有多个线程,而 Java 程序中的某个方法被某个线程调用直至执行完毕这个过程,会有专属于这个过程的局部变量表,操作数帧,动态连接,方法出口,等这些信息。而这些信息,我们需要用一个东西来存储,并且这个东西需要是线程私有的。 这个东西就叫做 Java栈(也称为 Java虚拟机栈),在这这个Java虚拟机栈中,会用一个个栈帧,来存储一个个方法被调用到执行完毕过程中的一些信息;并且一个栈帧出入虚拟机栈的过程,对应着一个方法被调用到执行完毕的过程。(更加具体的内容暂时不需了解,这一篇主要是用来了解 JVM 的体系结构。) 综上可知,我们的 JVM 体系结构中还需要一个 Java 虚拟机栈

  5. 因为一些历史原因(有兴趣的可以去了解一下),Java 不得不在内存区域中划分出一块区域专门来存储一个个本地方法被调用到执行完毕过程中的一些信息,这个区域也是栈,因为是为本地方法服务,所以称作本地方法栈,其实和 Java虚拟机栈的功能几乎差不多,只是Java虚拟机栈是为Java方法服务,而本地方法栈是为本地方法服务。在某些Java虚拟机中,其实直接着两个栈合二为一了。 为了以后看到有这个栈的虚拟机不陌生,所以我们的 JVM 体系结构中也来一个 本地方法栈

那么根据这些分析,我们的 JVM 体系结构图就变成了这样: 

而这个结构图,其实就是 JVM 体系结构图~


所以!你差不多是根据自己的分析知道了JVM体系结构!!记得给自己赞一个👍!

什么?你问我每个结构是干嘛的?我真的要一口老血喷出来....因为如果你是跟 着分析一步步看下来的,那你肯定知道每个结构的作用了。



其实开始也是想直接给出一个结构图,然后直接说每个结构的作用。但这样的方式印象不够深刻;而如果是带着你一起分析和思考,然后一步步推出结构图,那印象肯定会更深刻些,理解也会更深入些。(真的是,太暖了,这么用心良苦,我果然是最暖的~)

注:如果这篇帖子有任何错误和建议,欢迎大家留言,不胜感激!

至于JVM体系结构中每个结构的具体内容,我们一篇篇帖子慢慢道来~

持续更新,点个关注,不再迷路

为你分享程序员的世界。

非常感谢各位优秀的牛油们能看到这里,如果觉得帖子还不错的话,求点赞👍 求关注💗 求分享👬,对我来说真的 非常有用!!!

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐