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 加载进运行时数据区,然后再由执行引擎去解释其中的命令并交由操作系统执行。那么思考一下,这个运行时数据区需要什么东西?
-
首先,当一个虚拟机启动时,我们内存区域中肯定要准备一块地方来存放对象实列,而不同的线程都需要去创建对象实例,并且可能需要操作其他线程创建的实列,所以这个内存区域需要是线程共享的。这个区域我们可以称之为堆, 所以,我们的 JVM 体系结构中还需要一个线程共享的堆。
-
有了内存区域存储对象实列,那么类的结构信息,常量,静态变量,等一些其他信息,我们是不是也应该有一个内存区域来存放?并且,对于,类的结构信息,常量,静态变量 等这些信息,多个线程肯定都是需要用到的,但如果单独给每个线程都准备这么一个内存区域来存放这些信息的话,那就太浪费了。因为这些信息,不管哪个线程来访问都是一样的,那么这个内存区域应该设置成线程共享的。这个区域,我们可以称为方法区。 所以,我们的JVM 体系结构中还需要一个线程共享的 方法区。
-
我们一个 Java 程序里面可能有很多语句,也就是有很多指令(指令),这些语句由执行引擎去读取解释并交由操作系统运行,那么执行引擎怎么知道该读取那一条指令呢?执行引擎只负责读取并解释命令,并不知道该读取哪一条指令。所以我们要将该执行的指令告诉执行引擎。 而有一个东西叫做PC寄存器,或者叫做程序计数器,它可以用来记录当前线程所执行的字节码的行号。然后通过这个程序计数器,执行引擎就知道该执行哪条指令了。 所以,我们的 JVM 体系结构中还需要一个程序计数器。
-
一个 Java 程序运行之后,可以有多个线程,而 Java 程序中的某个方法被某个线程调用直至执行完毕这个过程,会有专属于这个过程的局部变量表,操作数帧,动态连接,方法出口,等这些信息。而这些信息,我们需要用一个东西来存储,并且这个东西需要是线程私有的。 这个东西就叫做 Java栈(也称为 Java虚拟机栈),在这这个Java虚拟机栈中,会用一个个栈帧,来存储一个个方法被调用到执行完毕过程中的一些信息;并且一个栈帧出入虚拟机栈的过程,对应着一个方法被调用到执行完毕的过程。(更加具体的内容暂时不需了解,这一篇主要是用来了解 JVM 的体系结构。) 综上可知,我们的 JVM 体系结构中还需要一个 Java 虚拟机栈。
-
因为一些历史原因(有兴趣的可以去了解一下),Java 不得不在内存区域中划分出一块区域专门来存储一个个本地方法被调用到执行完毕过程中的一些信息,这个区域也是栈,因为是为本地方法服务,所以称作本地方法栈,其实和 Java虚拟机栈的功能几乎差不多,只是Java虚拟机栈是为Java方法服务,而本地方法栈是为本地方法服务。在某些Java虚拟机中,其实直接着两个栈合二为一了。 为了以后看到有这个栈的虚拟机不陌生,所以我们的 JVM 体系结构中也来一个 本地方法栈。
所以!你差不多是根据自己的分析知道了JVM体系结构!!记得给自己赞一个👍!
什么?你问我每个结构是干嘛的?我真的要一口老血喷出来....因为如果你是跟 着分析一步步看下来的,那你肯定知道每个结构的作用了。
持续更新,点个关注,不再迷路
为你分享程序员的世界。
全部评论
(1) 回帖