JVM 是什么?Java 程序为啥需要运行在 JVM 中?
Java 是一门使用率非常高、从业者非常多的编程语言,在 Java 最重要的概念或者说环境就是 JVM,今天就和大家好好聊聊 JVM,让我们直接开始。
Java 架构
在开始之前,有必要先给大家讲讲 Java 架构。
用 C 和 C++ 等编程语言编写的代码被编译为特定于操作系统的机器代码,这类编程语言被称为编译语言。
但在 JavaScript 或 Python 等编程语言中,计算机无需编译即可直接执行代码,这些被称为解释语言。
Java 的特别之处在于,它结合了编译和解释,因此,在 Java 中,源代码首先被编译为带有字节码的类文件,然后这个类文件用解释器或 JIT 编译器执行。
但是,JVM 不是单独安装的,也不是您可以下载和安装的东西,JVM 总是带有 JDK 或 JRE。
让我们看一下 Java 架构以清楚地理解这一点,Java 架构中有 03 个主要组件:
Java 开发工具包 (JDK)。
JDK 是开发 Java 应用程序所需的软件开发工具包,包含 JRE 和一些开发工具,如 JavaDoc、Javac、Java Debugger 等。
Java 运行时环境 (JRE)。
Java 虚拟机 (JVM)。
JRE 是 JDK 的一部分,它创建了一个运行 Java 应用程序的环境,JRE 包含 Java 类库、Java 虚拟机 (JVM) 以及运行 Java 应用程序所需的其他组件。
什么是 JVM?
JVM 代表 Java 虚拟机,本质上是一个虚拟机或运行时环境,允许 Java 程序在多个设备和操作系统上运行和操作。
Java 程序不能在没有 JVM 支持的机器上运行,它是 Java 运行时环境 (JRE) 的一个组成部分。JVM 具有许多共同运行 Java 程序的规范。它本质上是平台相关的,即每个操作系统都有不同的 JVM。
JVM 有三个概念:
规范
实现
实例
规范是正式描述 JVM 实现所需内容的文档,拥有单一规范可确保所有实现都是可互操作的。JVM 实现是满足 JVM 规范要求的计算机程序。JVM 的实例是在执行编译成 Java 字节码的计算机程序的进程中运行的实现。
JVM 运行原理
主要有四个流程:
加载代码;
验证代码;
执行代码;
提供运行环境。
加载代码
类加载器读取“. class”文件,生成相应的二进制数据并保存在方法区,加载“ .class”文件后,JVM 在堆内存中创建一个 Class 类型的对象来表示该文件。
验证代码
确保.class 文件的正确性,即检查该文件是否正确格式化并由有效的编译器生成,如果验证失败,我们会得到运行时异常 java.lang.VerifyError,此活动由组件 ByteCodeVerifier 完成,一旦这个活动完成,那么类文件就可以编译了。
执行代码
执行引擎执行“ .class”(字节码),它逐行读取字节码,使用各种内存区域中存在的数据和信息并执行指令。
提供运行环境
提供运行时环境以支持各种应用程序。
JVM 内存
在程序执行期间必须存在各种运行时数据区域,当 JVM 首次启动时,会生成其中的几个对象。
可以构造和销毁特定于线程的对象,线程特定的对象分别与线程一起生成和销毁,通常用于跟踪指令。
JVM 总共分为五个子区域:
方法区:类名、父类名、方法等类信息保存在方法区。
堆:在堆区,保存所有对象的信息,每个 Java 虚拟机还有一个堆区,它也被认为是共享的资源。
堆栈:这个堆栈的每个块都称为一个激活记录/堆栈帧,它在其中的每个块中存储方法调用,每个局部变量都有一个帧。JVM 将在线程终止后销毁线程的运行时堆栈,因此,它不是公众可以访问的资源。
PC 寄存器:存储线程当前指令的地址,每个线程都有其 PC 寄存器。
本机方法区:每个线程都有其本机堆栈,用于存储有关本机方法参数的信息。
总结
1995 年,JVM 引入了两个革命性的概念,这些概念后来成为现代软件开发的标准:“一次编写,随处运行”和自动内存管理。
本文详细介绍了 JVM 的概念、工作原理,希望本文对您能够有所帮助,有任何疑问,可以在下方评论区与我讨论。
版权声明: 本文为 InfoQ 作者【wljslmz】的原创文章。
原文链接:【http://xie.infoq.cn/article/d106a97e51e30fe37730516ca】。未经作者许可,禁止转载。
评论