欢迎来到“Under The Hood”第一期。本期,我将给出JVM的基本结构和功能介绍。
什么是JVM?为什么要有它?
JVM(Java虚拟机)是一个运行已编译Java程序的抽象计算机。之所以说是”虚拟“的,是因为它基于“真正”的硬件平台和操作系统,一般以软件的形式实现。所有的Java程序都为JVM而编译。因此,在特定平台上运行已编译Java程序之前,该平台的JVM必须先要被实现。
JVM在Java的跨平台特性中,起着中间人的角色。它在已编译Java程序与底层硬件平台和操作系统之间,提供一个抽象层。JVM对Java的可移植性非常关键,因为,已编译Java程序运行在JVM之上,并独立于底层JVM的具体实现。
那么,是什么导致JVM的短小精悍?当被实现成软件时,JMV很小巧。它被设计成这样,是为了让它能够适用于尽可能多的地方,比如机顶盒,手机和个人电脑。JVM很精悍,是因为它的野心。”无处不在!“是它的战斗口号。它想要无处不在,并且Java程序”一次编写,到处运行“的程度说明了它的成功。
Java字节码
Java程序被编译成一种叫做字节码的东东。JVM执行Java字节码,所以字节码可以被认为是JVM的机器语言。Java编译器读取Java源文件,把它翻译成Java字节码并保存到类文件(.class文件)中。编译器会为源码中的每一个类生成一个类文件。
对JVM来说,字节码流就是指令序列。每条指令包含一个单字节的操作码和零个或多个操作数。操作码告诉JVM要执行的操作。如果JVM需要除操作码之外更多的信息去执行一项操作,那么,需要的信息作为操作数,紧跟在操作码之后。
每个字节码都有一个助记符,它可被当作JVM的汇编语言。例如,有个指令会让JVM把0压到堆栈中。该指令的助记符是iconst_0,字节码值是0×60。该指令没有操作数。另一个指令让程序的执行在内存中无条件向前向后跳转。这个指令需要一个操作数,它是一个指明从当前内存地址开始的2字节无符号偏移量。通过把偏移量加到当前内存地址,JVM可以获得要跳转的目标内存地址。该指令的助记符是goto,它的字节码值是0xa7。
虚拟部分
JVM的“虚拟硬件”可以分为四个部分:寄存器组,栈区,垃圾收集堆和方法区。这些部分很抽象,就像由它们组成的虚拟机一样;但是它们必须在每个JVM的实现中,以某种形式存在。
JVM中地址的是32位(4字节)的,因此,JVM可以处理4GB(2的32次方)的内存。栈区,垃圾收集堆和方法区处在这4GB内存中的某个地方,至于它们的具体内存地址,这取决于每个特定JVM的实现者。
JVM中一个字(word)的长度是32位的。JVM中有少数几个原始数据类型:byte(8位),short(16位),int(32位),long(64位),float(32位),double(64位),char(16位)。除了无符号Unicode字符char之外,其他6种数字类型都是有符号的。这些类型可以方便的映射到Java程序员可用的数据类型。另一个原始类型是对象句柄,它是一个指向堆中对象的32位地址。
由于包含字节码,方法区以字节边界对齐。栈和垃圾收集堆以字(32位)边界对齐。
寄存器:我少我自豪
JVM有1个程序计数器(counter)和3个管理栈的寄存器(register)。它只有很少的寄存器,是因为JVM字节码指令主要操作栈区。这种面向栈的设计,使得JVM指令集和JVM实现很小巧。
JVM使用程序计数器(也叫pc寄存器),跟踪当前执行指令的内存位置。另外3个寄存器(optop寄存器,frame寄存器和vars寄存器)指向当前执行方法栈帧上不同的部位。执行方法的栈帧持有特定方法调用的状态(本地变量,即时计算结果等)。
方法区和程序计数器
方法区是字节码呆的地方。程序计数器跟踪执行线程。当前字节码指令执行后,程序计数器会包含下一条执行指令的地址:一条指令执行之后,JVM把程序计数器设置为紧跟上一条指令的指令地址,除非上一条指令具体指明一次跳转。
Java栈和相关寄存器
Java栈用来保存字节码指令的参数和执行结果,给方法传递参数和返回结果,保存每个方法调用的状态。方法调用的状态被称为调用栈帧。var寄存器,frame寄存器和optop寄存器指向当前栈帧的不同部位。
Java栈帧有3个区:本地变量,执行环境和操作数栈。本地变量区,包含当前方法调用中使用的所有本地变量。它由vars寄存器指向。执行环境区用来维护栈区本身的操作。它被frame寄存器指向。操作数区用来作为字码指令的工作区。正是在这里,存放着字节码指令的参数和其返回结果。操作数栈区的顶部被optop寄存器指向。
执行环境通常夹在本地变量和操作数栈中间。当前执行方法的操作数栈总是在栈区的最上面,所以optop寄存器总是指向整个Java栈的顶部。
垃圾收集堆
堆是Java对象生存的地方。任何时候,你用new操作符分配的内存,都来自堆中。Java语言不允许你直接释放分配的内存。运行时环境会跟踪堆上每个对象的引用,自动释放那些不被引用的对象所占据的内存,这个过程被称为垃圾收集。
参考
本文译自:
The lean, mean, virtual machine
原创文章,转载请注明: 转载自LetsCoding.cn
本文地址: 短小精悍的虚拟机:JVM基本结构和功能介绍
分享到:
相关推荐
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
资源名称:实战Java虚拟机:JVM故障诊断与性能优化资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
《Java虚拟机:JVM高级特性与最佳实践(第2版)》这本书深入探讨了Java虚拟机(JVM)的工作机制,旨在帮助开发者们更好地理解Java程序的运行过程,优化性能,并解决潜在的问题。作者周志明是Java领域的资深专家,他...
然而,想要在高并发和高性能场景中充分发挥Java的优势,开发者需要对支撑Java程序运行的虚拟机——Java虚拟机(JVM)有深入的理解。《深入理解Java虚拟机JVM高级特性与最佳实践》一书,正是为解决这一需求而生。 ...
《Java虚拟机:JVM高级特性与最佳实践(第二版)》是一本深入探讨Java虚拟机(JVM)的专业书籍,对于Java开发者来说,理解JVM的工作原理和优化技巧至关重要。JVM作为Java语言的核心组成部分,它负责运行Java程序,...
需要两部分一起解压才可以: 当前为第二部分。 第一部分地址如下: https://download.csdn.net/download/dcxy0/10374640 也可以通过下面的地址找另外第一部分的文件:https://download.csdn.net/user/dcxy0/uploads
《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》是一本全面解析Java虚拟机的著作,作者周志明以其深厚的Java技术背景,深入剖析了Java技术体系,尤其是Java虚拟机(JVM)的工作原理及其高级特性。...
第1章 java体系结构介绍 1.1 为什么使用java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 java虚拟机 1.3.2 类装载器的体系结构 1.3.3 java class文件 1.3.4 java api 1.3.5 java程序设计...
《JVM调优总结》与《Java虚拟机:JVM高级特性与最佳实践》是两本深入探讨Java虚拟机(JVM)的书籍,对于Java开发者来说,它们提供了丰富的知识和实践经验,尤其对于想要理解JVM工作原理以及进行性能优化的专业人士更...
【深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)1】这本书是Java开发者必备的参考资料,详细探讨了Java虚拟机(JVM)的高级特性及其最佳实践。作者周志明通过深入浅出的方式,引领读者走进Java的世界,了解其...
《自己动手写Java虚拟机(GO语言)》是一本面向技术爱好者和程序员的书籍,它指导读者使用Go语言实现一个Java虚拟机(JVM)。这本书的编写基于《深入理解Java虚拟机》第二版以及相关的Java规范,旨在帮助读者深入...
深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) pdf下载-附件资源
实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送)
### Java运行原理与Java虚拟机 ...通过上述介绍可以看出,Java虚拟机不仅是Java程序运行的基础,也是其强大功能和广泛适用性的核心。随着技术的进步,Java虚拟机将继续演进,以适应不断变化的技术需求。
《实战Java虚拟机 JVM故障诊断与性能优化》是由葛一鸣编著的一本专业书籍,主要探讨了如何在实际工作中解决Java虚拟机(JVM)的相关问题,以及如何进行性能调优。书中涵盖了许多关键的知识点,让我们一一展开讨论。 ...
《深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版》-附件资源
自己动手写Java虚拟机 (Java核心技术系列)_943346.epub
JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old...
本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对...
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java...《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。