当前位置: 首页 > news >正文

class常量池、运行时常量池和字符串常量池详解

类常量池、运行时常量池和字符串常量池这三种常量池,在Java中扮演着不同但又相互关联的角色。理解它们之间的关系,有助于深入理解Java虚拟机(JVM)的内部工作机制,尤其是在类加载、内存分配和字符串处理方面。

类常量池(Class Constant Pool)

每个Java类文件(.class文件)都具有自己的类常量池,它用于存储编译期生成的各种字面量(如文本字符串、final常量值等)和符号引用(比如类和接口的全名、字段的名称和描述符、方法的名称和描述符),这是静态的数据结构。类常量池在编译期间就已经被确定,并被保存在.class文件中。

运行时常量池(Runtime Constant Pool)

运行时常量池是类被加载到JVM时类常量池的内存版本:当Java类被加载到JVM时,类文件中的类常量池内容被读取并存入到运行时常量池中,这一过程是类加载的一部分。Java程序中的每个类或接口都有自己的运行时常量池,每个类或接口的运行时常量池是动态的,属于方法区的一部分。它不仅包含了从类文件中传来的所有常量,还可能包括JVM运行期间新生成的常量,因此,运行时常量池比类常量池的内容更加丰富。

注:Java 8彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至堆或元空间中,方法区移至元空间,字符串常量移至堆。元空间是使用本地内存(Native Memory)来存储类的元数据信息的

字符串常量池(String Constant Pool)

字符串常量池专门用于存储字符串常量。对于 Hotspot 虚拟机来说,类加载时,字符串字面量作为类常量池的一部分信息被载入运行时常量池中,它们以特殊的形式存储在运行时常量池中,此时它们并未被实例化为Java堆中的String对象。只有当这个字符串字面量被调用时,才会对其进行解析,即检查字符串常量池中是否已经存在相同内容的字符串对象。如果存在,就直接返回指向该对象的引用,如果不存在,虚拟机会在字符串常量池中创建一个对应的String实例,并返回这个新实例的引用。

这种处理方式的优势在于,可以减少在类加载阶段对内存的需求和降低开销,因为不是所有的字符串字面量在类的使用周期内都会被用到。同时,此方法延迟了String对象的实例化,直到它们真正被需要,这有助于提高性能并减少内存的无谓占用。

字符串常量池是如何实现的?

在HotSpot虚拟机中:
在JDK 1.6及之前的版本,字符串常量池通常被实现为方法区中运行时常量池的一部分,即永久代(Permanent Generation)用于存储类信息、常量池、静态变量、即时编译器编译后的代码等数据。从JDK 1.7开始,字符串常量池的实现方式发生了重大改变。字符串常量池不再位于永久代,而是直接存放在堆(Heap)中,与其他对象共享堆内存。之所以要挪到堆内存中,主要原因是因为永久代的 GC 回收效率太低,只有在FulIGC的时候才会被执行回收。但是Java中往往会有很多字符串的生命周期都很短暂,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。

字符串常量池中的常量有以下几个来源:
1、字面量常量。
在代码中直接使用双引号括起来的字符串字面值(如 strings="hello”)会被认为是常量,并且会在编译后进入class文件的常量池,并且在运行阶段,进入字符串常量池。这是最常见的字符串常量来源。
2、intern()方法
String类提供了一个intern方法,用于将字符串对象手动添加到字符串常量池中。调用intern()方法时,如果字符串常量池中已经存在相同内容的字符串,将会返回常量池中的引用;如果不存在,则会在常量池中创建新的字符串

http://www.lryc.cn/news/346745.html

相关文章:

  • Meilisearch使用过程趟过的坑
  • 全面升级企业网络安全 迈入SASE新时代
  • 2024.1IDEA 到2026年
  • uniapp——点赞、取消点赞
  • react经验15:拖拽排序组件dnd-kit的使用经验
  • Webpack模块联邦:微前端架构的新选择
  • CMake 学习笔记(访问Python)
  • 【ruoyi】docker部署 captchaImage接口 FontConfiguration空指针异常
  • P1443 马的遍历
  • AI学习指南概率论篇-贝叶斯推断
  • 大数据测试
  • 金融业开源软件应用 管理指南
  • SolidWorks 齿轮配合
  • 鸿蒙开发-ArkTS语言-XML
  • 网安面经之文件上传漏洞
  • 如何使用 WavLM音频合成模型
  • 学习java第六十七天
  • Linux(Ubuntu24.04) 安装 MinIO
  • 视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?
  • 差速机器人模型LQR 控制仿真(c++ opencv显示)
  • 探索设计模式的魅力:权力集中,效率提升,中心化模式的优势与挑战
  • uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)
  • fastapi数据库连接池的模版
  • 如何批量将十六进制数据转成bin文件
  • 知识付费程序源码_30秒轻松搭建知识付费小程序_免费试用,知识付费工具有哪些?哪个比较好用?
  • 【系统架构师】-案例篇(九)容器化、CDN与微服务
  • OpenAI工作原理及核心机制
  • JVM调优-调优原则和原理分析
  • dell服务器安装ubuntu18.04桌面版教程
  • 医疗图像处理2023年CVPR:Label-Free Liver Tumor Segmentation-无标签肝肿瘤分割