Java 常量池总结

java中的常量池 本文介绍了Java中的三种常量池:Class文件常量池、运行时常量池和字符串常量池。Class文件常量池存储编译期的字面量和符号引用;运行时常量池是类文件常量池的运行时表现,位于元空间;字符串常量池用于存储字符串字面量,JDK7后移至堆内存。文章详细解析了字符串常量池的驻留机制、不同创建方式(如直接赋值、new String)的内存分配流程,并通过示例说明intern()方法的差异(JDK6与JDK8行为不同)。最后通过字符串拼接示例,展示了编译期优化对常量池的影响。这些机制共同保障了Java字符串的高效复 阅读详情

【本文是为了梳理知识的总结性文章,总结了一些自认为相关的重要知识点,只为巩固记忆以及技术交流,忘批评指正。其中参考了很多前辈的文章,包括图片也是引用,如有冒犯,侵删。】

对于Java中的常量池,一直有点困惑,看完网上的一些相关博客后,也似懂非懂,于是自己总结一下。关于常量池带着以下几个问题来逐步解答。

1 什么是常量池?

常量池毫无疑问是用来存放常量的,那么那些是常量呢?

常量池主要用于存放两大类常量:字面量和符号引用量。

  • 字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值(成员变量)等。
  • 符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
  1. 类和接口的全限定名
  2. 字段名称和描述符
  3. 方法名称和描述符

2 为什么需要常量池?

常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。

例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。常量池中所有相同的字符串常量被合并,只占用一个空间,节省了内存空间。

3 Java 中有哪些常量池?

Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。

  • 静态常量池 : Class文件中的常量池存在于编译时期,Class文件中的常量池不仅仅包含字符串字面量,还包含类、方法的信息,占用Class文件绝大部分空间。
  • 运行时常量池 :Jvm虚拟机在完成类装载操作后,在运行期将class文件中的常量池载入到内存中,并保存在方法区(JDK 8 中的元数据区)中,我们常说的常量池,就是指方法区(元数据区)中的运行时常量池。

此外还有字符串常量池,自认为也属于运行时常量池的一部分,不过和由于字符串的大量使用,于是单独进行管理。在JDK 1.6及以下,存放在PermGen Space中,而在 JDK 7和 JDK 8 中,存放到了堆内存中,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效,使用元数据区替代了永久代。

补充 : 运行时常量池中的常量,基本来源于各个class文件中的常量池,即每个class文件都有对应的常量池。字符串常量池JVM 实例全局共享的,只有一个。

4 字符串常量池的使用

运行时常量池相对与Class文件常量池的一个重要特征就是具备动态性,Java 并不要求常量一定只有编译器才能产生,运行时可以起将新的常量放入池中。String的intern()方法就可以将某个String对象在运行期动态的加入字符串常量池(如果常量池中已经存在就不加)并返回String pool中保证唯一的一个字符串对象的引用。

【参考文献】:

  1. 深理解Java虚拟机
深度解析Java常量池 Java常量池体系Class文件常量池运行时常量池字符串常量池方法区存储堆内存存储。 阅读详情

相关推荐

2025反爬终极方案:Python破解Cloudflare v2行为指纹,设备伪装+轨迹模拟拦截率压至1%

Cloudflare v2的反爬逻辑越来越接近“人类行为识别”,单纯的技术破解已失效,核心竞争力变成“模拟真实用户的能力”。本文的终极方案本质是“全方位复刻人类行为”——从设备指纹到操作轨迹,从网络特征到交互模式,让爬虫成为“无法被区分的真实用户”。这套方案的优势是“通用性强”,不仅适用于Cloudflare v2,也能破解大多数高反爬网站(如小红书、知乎、跨境电商)的行为检测;且代码可直接复用,新手只需替换目标URL和数据提取逻辑,就能快速落地。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2353

JAVA 方法区是在堆里面吗

三种情况:1、 java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;2、 java7中,static变量从永久代移到堆中;3、 java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中...

Akaks的博客 1万+

在Unity3d使用yolov8的onnx模型

输出OUTPUTS是float32[1,35,8400],表示它会输出一个大小为[1, 35, 8400]的浮点数张量。这个输出张量的维度表示了检测到的目标的数量、每个目标的预测参数以及网格单元的数量。输出张量的第一个维度1表示检测到的目标数量。每个目标由35个值组成,表示目标的类别、置信度、边界框的坐标及10个特定点的位置。要取得8400个数据中置信度最高的数据,然后获取该数据其他channel的数据。运行结果:(蓝色是检测手的边框,红点是自定义的点),其中的四个数字分别表示不同的维度。

shenqingyu0605202324的博客 5601

Java常量池储存什么_JAVA常量池中存储的常量是什么

展开全部我当初也存在这样一个疑问,下面我把e69da5e887aa3231313335323631343130323136353331333262356165当初所搜集的一些资料以及自己的理解贴出来给你看看(比较多,需要耐心点看,呵呵):理解Java常量池JVM运行时数据区的内存模型由五部分组成:【1】方法区【2】堆【3】JAVA栈【4】PC寄存器【5】本地方法栈对于String s = "hah...

weixin_39875760的博客 2310

告别过热焦虑:用Ansys Icepak给你的电子设备做个“水冷体检”(附冷板案例全流程)

本文详细介绍了如何利用Ansys Icepak进行电子设备水冷系统的热仿真分析,帮助工程师解决设备过热问题。通过冷板案例全流程演示,展示了从几何处理、材料设定到求解器设置和后处理的关键步骤,提升散热设计效率与准确性。

weixin_29299807的博客 440

别再到处找包了!Keil5芯片支持包(Pack)最全管理指南:安装、更新、迁移与离线备份

本文详细解析了Keil5芯片支持包(Pack)的全生命周期管理,包括安装、更新、迁移与离线备份的工程化解决方案。针对STM32F10x等常见芯片,提供了高效获取Pack的策略、版本管理技巧及团队协作方案,帮助开发者解决常见的'Device Family Pack missing'等问题,提升嵌入式开发效率。

weixin_28729205的博客 539

HotSpot Java虚拟机中的“方法区”“持久代”“元数据区”的关系?

Sun/Oracle JDK的HotSpot VM中,直到JDK7都有“持久代”(Permanent Generation,简称PermGen)。也称为方法区。Oracle JDK8的HotSpot VM去掉“持久代”,以“元数据区”(Metaspace)替代之。1.Sun JDK6的HotSpot VM在PermGen里存的对象,按类型划分,有:非Java对象:instanceKlass -&g...

bear_lam的博客 4839

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4890

Java中的常量池(字符串常量池、class常量池和运行时常量池)

简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去优快云、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨: 在Java的内存分配中,总共3种常量池:1.字符串常量池(String Constant Pool):1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串

ZhuMin_ChosenOne的博客 4万+

Unity零基础到入门 ☀️| 小万字教程 对 Unity 中的 协程 ❤️全面解析+实战演练❤️

Unity,为了让Unity基础知识专栏更加完善,又肝了一篇协程来学习。 协程在Unity中还是很常用的,一起来看一下协程的基本概念和使用方法吧!

努力前行,总会成为自己心中的那道光 8万+

rk3568 Android12 默认授予预装app权限

默认授予预装应用权限可以避免用户在每次使用应用时都要重复同意权限请求。尽管在Android 12中,用户对权限的管理有了更高的控制权,但这也可能导致用户在频繁使用预装应用时感到繁琐和不必要的干扰。通过默认授权,减少了这种麻烦。一些厂商可能会根据其定制的Android系统(如Samsung的One UI、Xiaomi的MIUI)要求某些预装应用默认获得权限,以便应用能够提供厂商特定的功能。这也有助于设备厂商提供统一和稳定的服务,不至于因为权限问题导致某些功能无法使用。

weixin_35723192的博客 661

Java 常量池

常量池分为 Class 常量池常量池、运行时常量池、字符串常量池。 1、 Class 常量池常量池(静态常量池) Java 文件被编译成 Class 文件,Class 文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是 Class 常量池,Class 常量池是当 Class 文件被 Java 虚拟机加载进来后存放各种字面量 (Literal)和符号引用 。 字面量相当于 Java 语言层面常量的概念,如文本字符串、基础数据、声明为 final 的常量等;符号引用则属于编译原理方面的概念,

IT__learning的博客 7889

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2885

java中常量池存的是什么_Java中常量池是什么?Java常量池的介绍

本篇文章给大家带来的内容是关于Java中常量池是什么?Java常量池的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Java当中的常量池在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区。程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方法所使用的栈,而虚拟机栈是用来执行程序代码的栈,在方法区中有类变量...

weixin_33148993的博客 2952

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 常量池详解

java、jvm、常量池、虚拟机

李帅的博客 1874

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入解析 Java 常量池:Class 常量池、运行时常量池与字符串常量池

理解这些常量池的概念和特性对于 Java 开发者来说至关重要。它不仅有助于我们更好地理解 Java 程序的运行机制,还能帮助我们在开发过程中优化内存使用,避免常见的内存问题,如内存溢出等。

2201_75353178的博客 1409

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 中的常量池

总之,Java 常量池是一套围绕常量存储、复用、类加载支持的机制,从 Class 文件编译时的内容准备,到类加载后的运行时动态管理,再到不同 JDK 版本的演进优化,深刻影响着 Java 程序的内存使用、性能和灵活性 ,理解它对分析类加载过程、字符串优化、内存问题(如常量池内存溢出 )等都有重要意义。时,这些内容会被加载到运行时常量池 ,后续执行。方法相关的符号引用等。文件,其 Class 文件常量池会包含。,在 JDK 1.7 及之前还有。Java 里的常量池可细分为。,就会从运行时常量池获取。

weixin_43521001的博客 1113

java常量池总结

java常量池1.class常量池2.运行时常量池3.基本类型包装类常量池4.字符串常量池 1.class常量池 在JAVA中,Java类(.java)文件被编译后就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是class常量池,用于存放编译器生成的各种字面量和符号引用,每一个class文件都有一个对应的class常量池。 其中各种字面量包括: 1.文本字符串 2.八种基本类型的值 3.被声明为final的常量 符号引用包括: 1.类和方法的 全限

weixin_47983174的博客 1191

java常量池

方法时,在字符串常量池分配内存,内存值指向str对象。方法返回字符串常量池引用,与str引用不同。3.1 为什么要设计字符串常量池。方法返回引用和str是同一个引用。方法返回的引用与str引用一致。因为test通过形参传入,会。3.2 创建字符串对象的。3.4 字符串的不可变性。3.3 字符串的+操作。1 Class常量池。

GzlAndy的博客 661

java中常量池

java 中常量池,字符串常量池,intern() 方法详解,基本对象常量池

a141210104的专栏 1188

Java几种常量池区分(字符串常量池、class常量池和运行时常量池)

        在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。 1.全局字符串池(string pool也有叫做string literal pool)         全局字符串池里的内

Syntactic Sugar 1961

java常量池在哪里_java常量池在哪?有什么用处?

为了更方便的使用对象,常量池是我们需要了解的必要一环,下面来看看常量的用处及它的存放地点。Java常量池存放地点在哪?如图:在Java6和6之前,常量池一般是存放在方法区中的,到了Java7,常量池就被存放到了堆中,Java8之后,就取消了整个永久代区域,取而代之的是元空间。在运行时常量池与静态常量池都会存放在元空间中,但字符串常量池依然存放在堆中。常量池的用处是?常量池,是指在编译期被确定,并被...

weixin_39872395的博客 3305

Java中几种常量池(字符串常量池, Class常量池, 运行时常量池)的区别与联系

字符串常量池, Class常量池, 运行时常量池

向上的"狼"的博客 3729

java常量池:字符串常量池,静态常量池,运行时常量池,

转载自:https://blog.youkuaiyun.com/qq_25825923/article/details/84972256 字符串常量池(String Poll) java6: 存在于永久代中。 字符串常量池保存的是字符串常量。 java7: 转移到了堆中。 字符串常量池存的是字符串常量和堆内的字符串对象的引用。 静态常量池 zld自身理解:java编译后生成的...

祁东握力的博客 699

Java常量池

Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区。     程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方法所使用的栈,而虚拟机栈是用来执行程序代码的栈,在方法区中有类变量,类信息,方法信息,常量池(符号的引用,以表的形式存在的),堆是虚拟机执行程序代码的所用的堆。 常量?是一旦给定...

程序员随笔 220
上一篇: 阻塞非阻塞与同步异步的区别?
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值