IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [java]JVM之运行时常量池里到底有什么,mysql架构体系 -> 正文阅读

[Java知识库][java]JVM之运行时常量池里到底有什么,mysql架构体系

  • 虚拟机栈
  • 本地方法栈
  • 程序计数器

而运行时常量池是方法区的一部分,文字解释:

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(ConstantPool Table), 用于存放编译器生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

从这段描述中我们可以得出结论,运行时常量池里面存放的是从Class文件中的常量池表中加载到的数据,为了搞清楚运行时常量池里有什么,我们需要搞清楚对应常量池表里面有什么

2. 常量池表

2.1 Class文件的数据类型

先说一下Class的文件格式:Class文件的文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型,“无符号数”和“表”。

  • 无符号数属于基本的数据类型,以u1/u2/u4/u8来分别代表1个字节、2个字节、4个字节、8个字节的的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按utf-8编码构成字符串值。
  • 表是由多个无符号数或者其他表作为数据项构成的符合数据类型,为了便于区分,所有表的命名都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上也可以视作是一张表。

2.2 常量池

常量池可以比喻为Class文件里的资源仓库,它是Class文件结构中与其他项目关联最多的数据。

常量池中主要存放两大数据:字面量和符号引用。字面量比较接近Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。

2.2.1 符号引用

由于Java代码在进行Javac编译的时候,并不像C/C++那样有“连接”这一步骤,而是在虚拟机加载Clsss文件的时候进行动态连接,因此,在我们将Java代码编译成Class文件后,Class文件并不会保存方法、字段等在内存中的布局。为了解决这个问题,Class文件会在常量池内保存方法、字段等的符号引用。所谓符号引用,我们可以简单的理解为真正内存布局的占位符,在类加载过程的解析阶段,符号引用会被替换为真正的直接引用。

2.2.2 常量池的结构

常量池中每一项常量都是一个表,这些表都有一个共同的特点,即表结构的起始第一位为一个u1类型的标志位,代表着当前常量属于哪一种常量类型

常量池中的项目类型

项目类型描述
CONSTANT_Utf8_info1UTF-8编码的字符串
CONSTANT_Integer_info3整形字面量
CONSTANT_Float_info4浮点型字面量
CONSTANT_Long_info5长整型字面量
CONSTANT_Double_info6双精度浮点型字面量
CONSTANT_Class_info7类或接口的符号引用
CONSTANT_String_info8字符串类型字面量
CONSTANT_Fieldref_info9字段的符号引用
CONSTANT_Methodref_info10类中方法的符号引用
CONSTANT_InterfaceMethodref_info11接口中方法的符号引用
CONSTANT_NameAndType_info12字段或方法的部分符号引用
CONSTANT_MethodHandle_info15表示方法句柄
CONSTANT_MethodType_info16表示方

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

法类型 |
| CONSTANT_Dynamic_info | 17 | 表示一个动态计算常量 |
| CONSTANT_InvkoeDynamic_info | 18 | 表示一个动态方法调用点 |
| CONSTANT_Module_info | 19 | 表示一个模块 |
| CONSTANT_Package_info | 20 | 表示一个模块中开放或者导出的包 |

具体表信息和表结构如下:

2.2.2.1 CONSTANT_Utf8_info

类型标志描述
tagu1值为1
lengthu2UTF-8编码的字符串占用的字节数
bytesu1长度为length的UTF-8编码的字符串,总共length个

2.2.2.2 CONSTANT_Integer_info

项目类型描述
tagu1值为3
bytesu4按照高位在前存储的int值

2.2.2.3 CONSTANT_Float_info

项目类型描述
tagu1值为4
bytesu4按照高位在前存储的float值

2.2.2.4 CONSTANT_Long_info

项目类型描述
tagu1值为5
bytesu8按照高位在前存储的long值

2.2.2.5 CONSTANT_Double_info

项目类型描述
tagu1值为6
bytesu8按照高位在前存储的double值

2.2.2.6 CONSTANT_Class_info

项目类型描述
tagu1值为7
indexu2指向全限定名常量项的索引

2.2.2.7 CONSTANT_String_info

项目类型描述
tagu1值为8
indexu2指向字符串字面量的索引

2.2.2.8 CONSTANT_Fieldref_info

项目类型描述
tagu1值为9
indexu2指向声明字段的类或者接口描述符CONSTANT_Class_info的索引项
indexu2指向字段描述符CONSTANT_NameAndType的索引项

2.2.2.9 CONSTANT_Methodref_info

项目类型描述
tagu1值为10
indexu2指向声明方法的类或者接口描述符CONSTANT_Class的索引项
indexu2指向名称及类型描述符CONSTANT_NameAndType的索引项

2.2.2.10 CONSTANT_InterfaceMethodref_info

项目类型描述
tagu1值为11
indexu2指向声明方法的接口描述符CONSTANT_Class的索引项
indexu2指向名称及类型描述符CONSTANT_NameAndType的索引项

2.2.2.11 CONSTANT_NameAndType_info

项目类型描述
tagu1值为12
indexu2指向该字段或方法名称常量项的索引
indexu2指向该字段或方法描述符常量项的索引

2.2.2.12 CONSTANT_MethodHandle_info

项目类型描述
tagu1值为15
reference_kindu1值必须在1至9之间[1-9]它决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为
reference_indexu2值必须是对敞亮吃的有效索引

2.2.2.13 CONSTANT_MethodType_info

项目类型描述
tagu1值为16
descriptor_indexu2值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示方法的描述符

2.2.2.14 CONSTANT_Dynamic_info

项目类型描述
tagu1值为17
bootstrap_method_attr_indexu2值必须是对当前Class文件中引导方法表的bootstrap_methods[]数组的有效索引
name_and_type_indexu2值必须是对当前常量池的有效索引,常量池在该索引处的项必须是CONSTANT_NameAndType_info结构,表示方法名和方法描述符

2.2.2.15 CONSTANT_InvkoeDynamic_info

项目类型描述
tagu1值为18
bootstrap_method_attr_indexu2值必须是对当前Class文件中引导方法表的bootstrap_methods[]数组的有效索引
name_and_type_indexu2值必须是对当前常量池的有效索引,常量池在该索引处的项必须是CONSTANT_NameAndType_info结构,表示方法名和方法描述符

2.2.2.16 CONSTANT_Module_info

| 项目 | 类型 | 描述 |

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:15:32  更:2021-12-04 13:19:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:46:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码