jvm 什么是常量池,常量池定义 class常量池

news2025/1/11 10:12:41

首先需要理解下Java的class文件,以及class文件结构:

1.Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文 件之中,中间没有任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割 成若干个8个字节进行存储

    注: 任何一个Class文件都对应着唯一的一个类或接口的定义信息,但是反过来说,类或 接口并不一定都得定义在文件里(譬如类或接口也可以动态生成,直接送入类加载器中)

2.Class文件格式采用类c语言结构体的伪结构来存储数据

            结构:

                      a. 无符号数

                      b.

      a.无符号数属于基本数据类型,u1:代表1个字节无符号数,有四个参数 u1, u2, u4, u8。 它们们用来描述数组,索引引用,数量值或字符串

      b. :无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名 都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上也可以视 作是一张表,这张表由下图所示的数据项按严格顺序排列构成

 3. 图中的constant_poll 即常量池,是class中的表结构(类型cp_info)

 4. 常量池可以比喻为class文件存放的资源仓库,它是class结构中与其他项目引用最多的数据,通常也是占用class文件空间最大的数据项目之一

 5. 常量池入口为u2类型数据,为常量池容量计数值,常量池中有21项常量。索引范围1~21

 6. 常量池存放类型

     a. 字面量(Literal)

     b. 符号引用(Symbolic References)

   字面量: 文本字符串,声明为final的常量值等

   符号引用:

                    ·被模块导出或者开放的包(Package)

                    ·类和接口的全限定名(Fully Qualified Name)

                    ·字段的名称和描述符(Descriptor)

                    ·方法的名称和描述符

                    ·方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)

                    ·动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)

7. class文件不会保存方法,或字段的值而是通过常量池进行转换使用。虚拟机进行类加载时,从常量池获取到字面量(一些常量值),符号引用(指针引用数据),在类创建或运行时解析,从常量池拿到这些数据,到具体的内存地址之中。(我认为与将代码中的魔法值,类似1,2,字符串等抽出来,单独放到一个类中类似,常量池就是做这个的)

8.常量池每一项常量都是一个表,截止jdk13,一共有17种不同类型常量:

 

9. 总结来说,常量池就是存储类中(编译后的class文件):字符串的值,final常量,方法引用,方法描述,方法类型等的表结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四章 串 KMP算法

一、代码实现 int Index_KMP(SString s,sstring T,int next[] ){int i1, j1;while(i<s.length&&j<T.length){if(j0] ||s.ch[i]T.ch[j]){i;j;//继续比较后继字符}elsejnext[j];//模式串向右移动}if(j>T.length)return i-T.length;//匹配成功elsereturn 0; } …

1273. 删除树节点;2786. 访问数组中的位置使分数最大;889. 根据前序和后序遍历构造二叉树

1273. 删除树节点 核心思想&#xff1a;递归&#xff0c;从根节点出发&#xff0c;枚举父节点的子节点&#xff0c;如果它们的值加起来为0的话就把父亲的节点删除后剩余的数置为0&#xff0c;默认返回一个节点&#xff0c;del_remain保存的是&#xff0c;del_remain[x]表示完成…

常见的数据库备份方法,常用的数据库备份方法有哪三种

数据库作为存储和管理这些信息的核心&#xff0c;其安全性和稳定性尤为重要。因此&#xff0c;定期进行数据库备份是保护数据完整性的重要途径。下面我们就详细介绍几种常见的数据库备份方法。 1.全量备份 全备份是指备份数据库中的所有数据和元数据。这种方法通常用于开发或测…

【javaweb】学习日记Day6 - Mysql 数据库 DDL DML DQL

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、概述 1、如何安装及配置路径Mysql&#xff1f; 2、SQL分类 二、DDL 数据定义 1、数据库操作 2、IDEA内置数据库使用 &#xff08;1&…

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…

中国电动汽车市场再添新玩家,小米启动造车梦 | 百能云芯

综合多家媒体广泛报道&#xff0c;知情人士透露&#xff0c;小米公司已获得正式批准&#xff0c;允许其踏入电动汽车制造领域。这一举措标志着这家在智能手机和物联网领域声名卓著的企业正迈向汽车制造领域&#xff0c;可谓迈出了重要的一步。按照计划&#xff0c;小米将于2024…

CTFhub-sqli注入-报错注入

用到的函数 updatexml(1&#xff0c; &#xff0c;1) concat(0x7e, ,0x7e) group_concat(目标值) right(&#xff0c;32) 1 1 1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 1 union select updatexml(1,concat(0x7e,(select(group_concat(ta…

LeetCode438.找到字符串中所有字母异位词

因为之前写过一道找字母异位词分组的题&#xff0c;所以这道题做起来还是比较得心应手。我像做之前那道字母异位词分组一样&#xff0c;先把模板p排序&#xff0c;然后拿滑动窗口去s中从头到尾滑动&#xff0c;窗口中的这段字串也给他排序&#xff0c;然后拿这两个排完序的stri…

使用ELK(ES+Logstash+Filebeat+Kibana)收集nginx的日志

文章目录 Nginx日志格式修改配置logstash收集nginx日志引入Redis收集日志写入redis从redis中读取日志 引入FilebeatFilebeat简介Filebeat安装和配置 配置nginx转发ES和kibanaELK设置账号和密码 书接上回&#xff1a;《ELK中Logstash的基本配置和用法》 Nginx日志格式修改 默认…

Nexus私有仓库+IDEA配置远程推送

目录 一、docker安装nexus本地私服&#xff0c;Idea通过maven配置deploy本地jar包&#xff08;简单&#xff09; 二、docker push镜像到第三方nexus远程私服&#xff08;shell命令操作&#xff09; 三、springboot通过maven插件自动生成docker镜像并push到nexus私服&#xf…

哈夫曼编码:高效的数据压缩方案

在计算机科学中&#xff0c;数据的压缩与编码一直是重要的研究领域。哈夫曼编码&#xff08;Huffman Coding&#xff09;作为一种常用的数据压缩方法&#xff0c;以其高效的压缩率和广泛的应用而闻名。本文将介绍哈夫曼编码的原理、构建过程以及代码实现&#xff0c;并通过符号…

日常Debug之:智子攻陷了我的MCU!!!

环境&#xff1a;AT32F403AVGT7、IAR8.30、J-LINK 现象&#xff1a;定时器中断里遇到 -1 < 0 返回false的情况。如图&#xff1a; 出现了if(-1 > 0){}为True的情况。 尼马&#xff01;&#xff01;&#xff01;是不是被智子监控了呢&#xff1f; 经过分析&#xff1a;…

点亮社交新篇章:探索 WeTalk 新增的头像与群聊功能

目录 引言&#xff1a; 引入头像功能&#xff1a; 头像功能的优势&#xff1a; 引入群聊功能&#xff1a; 群聊功能的优势&#xff1a; 引入头像功能&#xff1a; 查看头像&#xff1a; ​编辑 上传头像&#xff1a; 引入群聊功能&#xff1a; 创建群聊&#xff1a…

scp命令用于Windows和Linux之间复制文件

scp使用 简述Windows和Linux之间复制文件使用示例从本地复制到远程复制文件复制文件夹 从远程复制到本地复制文件复制文件夹 在Linux下&#xff08;从Linux复制到Windows&#xff09;复制文件复制文件夹 在Windows下&#xff08;从Windows复制到Linux&#xff09;复制文件复制文…

Mybatis中的分页查询,以及对于特殊符号的处理

目录 一.分页查询 1.老版本的分页查询 &#xff08;通过工具类BaseDao来实现&#xff09; 2.利用Mybatis实现分页效果 2.1最低级版本&#xff08;利用limit实现&#xff09; 首先在xml定义分页需要的方法 然后在bookbiz实现方法 其次在bookbizImpl继承此方法&#xff0c;并…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

YOLOv7-tracker 目标追踪 输入视频帧

参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yolov7-tracker 码云链接&#xff1a;https://gitee.com/YFwinston/Yolov7-tracker 1 项目安装 1.1 环境搭建 平台&#xff1a;AutoDL 选…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…