当Java虚拟机运行时,它需要内存来存取很多东西。例如,字节码,从已经装载的class文件中得到的其他信息,程序创建的对象,传递给方法的参数,返回值,局部变量,已经运算的中间结果等。Java虚拟机把这些数据都组织到几个“运行时数据区”,以便于管理,主要包括方法区、堆、Java栈、PC寄存器、本地方法栈。
方法区
在Java虚拟机中,关于被装载的类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件--------一个线性二进制数据流--------然后把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。
由于所有线程都共享方法区,因此它们对方法区数据的访问必须被设计是线程安全的。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。
对每个装载的类型,虚拟机都会在方法区中存储一下类型信息:
l 这个类型的全限定名
l 这个类型的直接超类的全限定名(除了Object)
l 这个类型的是类类型还是接口类型
l 这个类型的访问修饰符
l 任何直接超接口的全限定名的有序列表
除了上面的基本信息以外,虚拟机还得为每个被装载的类型存储以下信息:
l 该类型的常量池
l 字段信息
l 方法信息
l 除了常量以外的所有类变量
l 一个到ClassLoader的引用
l 一个到Class类的引用
指向ClassLoader的引用
每个类型被装载的时候,虚拟机必须跟踪它是由启动类装载器还是由用户自定义类装载器装载的。如果是用户自定义类装载器装载的,那么虚拟机必须在类型信息中存储对该类型装载器的引用。这是作为方法表中的类型数据的一部分保存的。
虚拟机会在动态连接期间使用这个信息。当某个类型引用另一个类型的时候,虚拟机会请求装载发起引用的类装载器来装载被引用的类型。这个动态连接的过程,对于虚拟机分离命名空间的方式也是至关重要的。为了能够正确执行动态连接以及维护多个命名空间,虚拟机需要在方法表中得知每个类都是哪个类装载器装载的。
指向Class的引用
对于每个被装载的类型(不管是类还是接口),虚拟机都会相应地为它在堆上创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方法区中的类型数据关联起来。
在程序中,可以使用指向Class对象的引用。Class类中的两个方法可以得到任何已装载的类的Class实例的引用。分别是Class.forName(“”)以及Class.getClass()。
给出一个Class对象的引用,就可以通过Class类中的定义的方法来找出这个类型的相关信息。如果查看这些方法会很快意思到,Class类使得运行程序可以访问方法区中保存的信息。下面的是Class类中声明的方法:
public string getName(); 返回类的全限定名
public Class getSuperClass(); 返回类型的直接超类实例(object或者接口返回null)
public boolean isInterface(); 判断该类型是否是接口
public Class[] getInterfaces(); 返回一个Class对象数组,每个Class对象对应一个直接超类接口,如果该类型没有直接超接口,getInterfaces()返回一个0长度数组
public ClassLoader getClassLoader(); 返回该类型的ClassLoader对象的引用
堆
Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。
Java对象中包含的基本数据由他所属的类及其所有超类声明的实例变量组成。只要有一个对象引用,虚拟机就必须能够快速的定位对象实例的数据。另外,它也必须能通过该对象引用访问相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。
程序计数器
每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿“地址”,这里的“地址”可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Java栈
Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。
和方法区和堆一样,Java栈和帧在内存中也不必是连续的。帧可以分布在连续的栈里,也可以分布在堆里,或者两者兼有的。
栈帧
栈帧由三部分组成:局部变量、操作数栈和帧数据区。
当虚拟机调用一个Java方法时,它从对应类的而类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后压入Java栈中。
局部变量:存放局部变量和方法参数
操作数栈:线程的工作区,用来存放运算过程中的临时数据
帧数据区:保存支持常量解析、正常方法返回以及异常派发机制的数据
分享到:
相关推荐
深入理解Java运行时数据区_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
自己总结的jvm中运行时数据区概述及线程的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
JVM运行时数据区原理解析 JVM运行时数据区是Java虚拟机中最重要的组成部分之一,它是JVM运行时的核心区域,负责存储和管理程序运行时需要的数据。根据JVM规范,JVM运行时数据区可以分为五个部分:PC寄存器、虚拟机...
4. 运行时数据区 关于运行时数据官方解释:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5 4.1 堆 (heap) 堆在虚拟机中是一块共享区域, 存放 对象实例 和数组; 堆在虚拟机启动的时候...
4. 在使用DSO算法处理KITTI数据集时,由于KITTI数据集不包含曝光参数和矫正信息,因此不需要在运行DSO算法时添加gamma和vegene参数。 5. KITTI数据集提供的校准参数文件(calib文件)与DSO算法的要求不完全相同。...
数控机床运行状态数据采集及数据处理技术是现代制造业中关键的技术之一,它对于提高数控机床的性能、稳定性和智能化水平具有重要意义。以下是对提供的文件内容中的知识点的详细解读。 首先,文章的标题《数控机床...
类加载器负责加载Java类文件,运行时数据区负责存储Java程序的运行时数据,而执行引擎则负责执行Java字节码。 类加载器 类加载器是Java虚拟机的一个重要组件,负责加载Java类文件。类加载器可以分为三种类型:引导...
水处理设备运行数据记录表 水处理设备运行数据记录表是记录水处理设备运行情况的重要文档。它是水处理厂、水厂、污水处理厂等单位记录水处理设备运行情况的必备文件。下面我们将详细介绍水处理设备运行数据记录表的...
Java虚拟机(JVM)是Java Virtual Machine的缩写,...类加载器负责将字节码文件加载到内存中,运行时数据区用于存储程序执行时所需的数据,执行引擎则负责执行字节码文件,而垃圾收集器则负责回收不再使用的内存空间。
MVSNet 重建dtu数据集 scan23重建效果文件 运行文件下载 MVSNet 重建dtu数据集 scan23重建效果文件 运行文件下载 MVSNet 重建dtu数据集 scan23重建效果文件 运行文件下载 MVSNet 重建dtu数据集 scan23重建效果文件 ...
风电机组完整运行数据集,包括风速、风向、温度、湿度、气压和真实功率等共30万余条。WINDSPEED 预测风速 WINDDIRECTION 风向 TEMPERATURE 温度 HUMIDITY 湿度 PRESSURE 气压 PREPOWER 预测功率(系统生成) ROUND(A...
1. **数据规范**:定义了城市运行数据的格式、编码、命名规则等,确保数据的一致性和可读性。 2. **数据质量**:提出了数据的准确性、完整性、时效性等要求,以提供可靠的数据支持。 3. **数据分类与编码**:制定...
6. **安全风险**:虽然360是一款知名的安全软件品牌,但在下载和使用第三方提取的独立运行包时,仍需警惕潜在的恶意软件风险,确保从可靠来源获取。 7. **数据备份**:最佳的防护措施始终是定期备份重要数据,...
# 基于C++语言的游戏运行时数据dump工具 ## 项目简介 本项目是基于C++语言开发的游戏运行时数据dump工具。借助Android平台上Zygote进程的安全增强解决方案Zygisk,结合处理Il2Cpp(Unity跨平台运行时环境)的dump...
数据中心运行管理技术,作为企业数据中心建设参考
电厂磨煤机实际运行数据
1.0.1为实现数据中心基础设施系统与设备运行维护的规范性、 安全性和及时性确保电子信息设备运行环境的稳定可靠,制订本 标准 1.0.2本标准适用于已投入运行的数据中心 1.0.3数据中心基础设施的运行维护除应符合本...
常用于动态场景的底层支持,如:数据中台、可视化、低代码后台、工作流、自定义表单、异构数据库迁移同步、物联网车联网数据处理、数据清洗、运行时自定义报表/查询条件/数据结构、爬虫数据解析等运行时动态注册切换...