java虚拟机(Java Virtual Machine)是运行所有Java程序的抽象计算机,是Java语言的运行环境。支持Java面向网络体系结构三大支柱的所有方面:平台无关性、安全性和网络移动性。
根据上图所示,java虚拟机体系结构中最重要的部分就是类装载子系统、运行时数据区、执行引擎等
类装载子系统
Java虚拟机中,负责查找并装载类型的那部分称为类装载子系统。
Java虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。启动类装载器是Java虚拟机实现的一部分。用户自定义类装载器是Java程序的一部分。
类装载器的动作:
1. 装载---查找并装载类型的二进制数据
2. 连接---执行验证,准备,以及解析(可选)
验证:确保被导入类型的正确性
准备:为类变量分配内存,并将其初始化为默认值
把类型中的符号引用换为直接引用
3. 初始化---把类变量初始化为正确的初始值
运行时数据区
(1) 方法区
当JVM使用类装载器定位Class文件,并将其输入到内存中时。会提取Class文件的类型信息,并将这些信息存储到方法区中。同时放入方法取中的还有该类型中的类静态变量。下面我们具体看看需要存储哪些信息?
●该类型的全限定名。
●该类型的直接超类的全限定名。
●该类型是类类型还是接口类型。
●该类型的访问修饰符(public、abstract、final)。
●任何直接超接口的全限定名的有序列表。
●该类型的常量池。比如所有类型、方法和字段的符号。基本数据类型的直接数值等。
●字段信息。对类型中声明的每个字段,方法区中必须保存下面的信息。除此之外,这些字段在类或者接口中的声明顺寻也必须保存。
字段名
字段的类型
字段的修饰符(public, private, protected, static, final, volatile, transient的某个子集)
●方法信息。和字段一样保存方法的相关信息。
方法名
方法的返回类型
方法的参数的数量和类型
方法的修饰符
方法的字节码
操作数栈和栈帧中局部变量的大小 (见下面Java栈的内容)
异常表
●类静态变量。这里要注意:类中的静态变量时存放在方法区中的。并不是存放在堆中某一个该类型的对象中的。 也就是我们常说的“类静态变量属于类,而不属于对象”这句话的由来了。
●指向ClassLoader类的引用。任何类都需要被类装载器装入内存。如果是被用户自定义类装载器装载的,那么JVM必须在类型信息中存储对该装载器对象的引用。
●指向Class类的引用。对于每一个被装载的类型,虚拟机都会相应的为它创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方法区中的类型信息关联起来。 这就使得我们可以在程序运行时查看某个加载进内存的类的当前状态信息。也就是反射机制实现的根本。
●方法表。 为了能快速定位到类型中的某个方法。JVM对每个装载的类型都会建立一个方法表,用于存储该类型对象可以调用的方法的直接引用,这些方法就包括从超类中继承来的。而这张表与Java动态绑定机制( 参见《java动态绑定机制实现多态 》 )的实现是密切相关的。
(2) 堆
堆存放所有生成的对象及对象的实例变量。JVM会根据new指令在堆中开辟一个确定类型的对象内存空间。但是堆中开辟对象的空间并没有任何
人工
指令可以回收,而是通过JVM的垃圾回收器负责回收。
(3) 程序计数器
对于一个运行的Java而言,每一个线程都有一个PC寄存器。当线程执行Java程序时,PC寄存器的内容总是下一条将被执行的指令地址。
(4) Java栈
每启动一个线程,JVM都会为它分配一个Java栈,用于存放方法中的局部变量,操作数以及异常数据等。当线程调用某个方法时,JVM会根据方法区中该方法的字节码组建一个栈帧。并将该栈帧压入Java栈中,方法执行完毕时,JVM会弹出该栈帧并释放掉。
注意,Java栈中的数据是线程私有的,一个线程是无法访问另一个线程的Java栈的数据。这也就是为什么多线程编程时,两个相同线程执行同一方法时,对方法内的局部变量时不需要数据同步的原因。
执行引擎
执行引擎处于JVM的核心位置,在Java虚拟机规范中,它的行为是由指令集所决定的。尽管对于每条指令,规范很详细地说明了当JVM执行字节码遇
到指令时,它的实现应该做什么,但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数
加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。
Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。
分享到:
相关推荐
【深入理解Java虚拟机体系结构】 Java虚拟机(Java Virtual Machine,简称JVM)是Java平台的核心组成部分,它使得Java程序具有平台无关性,保证了“一次编译,到处运行”的特性。Java虚拟机主要负责加载类文件并...
Java 虚拟机的体系结构由多个子系统组成,包括类加载器子系统、执行引擎、数据区等。类加载器子系统负责加载程序中的类型(类和接口),并赋予唯一的名字。执行引擎负责执行被加载类中包含的指令。数据区中保存了...
Java虚拟机体系结构 Java虚拟机由三个主要组件组成:类加载器、运行时数据区和执行引擎。类加载器负责加载Java类文件并将其转换为Java虚拟机可以理解的格式;运行时数据区提供了一块内存空间,用于存储Java对象和类...
Java虚拟机 Java虚拟机体系结构 Java虚拟机的运行过程
六、Java虚拟机体系结构 JVM由指令集、寄存器、栈、垃圾回收堆和方法区域五个主要部分构成。指令集包含了约248个字节码指令,涵盖了基本的CPU运算,如算术操作、流程控制等。每个指令由一个操作码和零个或多个操作数...
本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...
Java虚拟机体系结构 Java虚拟机的体系结构主要由四个部分组成:子系统、内存区、数据类型和指令。这些组成部分一起展示了抽象的虚拟机的内部抽象体系结构。 Java Class文件 Java Class文件是Java虚拟机执行Java...
MiniJavaVM—个Java虚拟机的设计和实现 在本篇文章中,我们将详细介绍 MiniJavaVM 的设计和实现,包括其总体架构、功能、运行环境和开发工具,以及具体的实现步骤。 第一章绪论 Java 虚拟机(Java Virtual ...
Java虚拟机的体系结构主要包括以下几个部分: 1. **类加载子系统**(Class Loader Subsystem):负责将Java类加载到内存中,并对它们进行验证、解析和初始化。每个Java应用程序都有一个类加载器子系统,该子系统...
#### Java虚拟机体系结构 - **Java虚拟机的体系结构**: - **数据类型**:包括原始类型(如int、long等)和引用类型(如Object)。 - **字长**:通常为32位或64位,取决于JVM的具体实现。 - **类装载子系统**:...
综上所述,《深入Java虚拟机》这本书覆盖了Java体系结构、平台无关性、安全性、网络移动性以及JVM内部运作等多方面的内容,对于想要深入了解Java虚拟机及其工作机制的读者来说是非常有价值的参考资料。
#### Java虚拟机体系结构 Java虚拟机主要由以下几部分构成: - **指令集**:用于定义Java虚拟机能理解的操作命令。 - **寄存器**:用于存储临时数据。 - **栈**:用来存储线程私有的数据。 - **无用单元收集堆...
《Java虚拟机精讲》以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法...
- **异常体系**:Java虚拟机支持异常处理机制,可以通过try-catch-finally语句来捕获和处理异常。 - **异常传播**:如果方法没有处理异常,则会将异常传递给调用者。 #### 九、指令集概览 - **类型与Java虚拟机**:...
Java虚拟机(JVM)是Java程序运行的核心,它的体系结构和内存模型是理解Java性能优化和内存管理的关键。在《深入Java虚拟机 (第二版)》这本书中,作者详细探讨了JVM的各个方面,帮助开发者提升代码效率和稳定性。 ...
JVM的体系结构包括类装载子系统和运行引擎,前者负责加载具有指定名称的类或接口,后者执行已加载类中的指令。JVM的内部结构分为五个主要部分:方法区、堆、Java栈、程序计数器和本地方法栈。方法区存储类信息,堆...
Java的诞生对软件产业产生了深远影响,它推动了分布式计算模式、基于构建的开发方法和多层应用体系结构,如CORBA和后来的Java 2平台与.NET平台的竞争。此外,Java促进了软件从开发中心向服务中心的转变,强调软件的...
### Java虚拟机与Java程序的生命周期 #### 一、Java虚拟机(JVM)概述 Java虚拟机(JVM)是一种可以执行Java字节码的虚拟机。它为Java应用程序提供了一个独立于硬件平台的运行环境,使得Java程序可以在任何安装了JVM...