什么是 Java 中的常量池?
Java 中的常量池
Java 中的常量池(Constant Pool)是用于存放程序中常量(如字符串、数字、类、方法等)的内存区域。常量池的主要作用是提高内存的使用效率和性能,避免重复创建相同的常量实例。
常量池主要分为两种类型:
1. 字符串常量池(String Constant Pool)
定义:字符串常量池是 JVM 在运行时维护的一个特殊的常量池,它用于存储字符串字面量(literal)和字符串常量。
特性:
- 字符串字面量会被自动添加到字符串常量池中,例如:
String str = "Hello";。 - 对于相同的字符串字面量,JVM 会返回常量池中已存在的对象,而不是重新创建新的字符串对象,这样可以节省内存。
- 字符串常量池是一个堆外的存储区域。
- 字符串字面量会被自动添加到字符串常量池中,例如:
使用示例:
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // 输出 true,因为它们指向同一个字符串对象
2. 类和方法常量池(Class and Method Constant Pool)
- 定义:每个类或接口在编译后都会有一个类常量池,它用于存储类、方法、字段的符号引用。
- 特性:
- 包含类名、字段名、方法名等符号引用,在类加载时,JVM 会将这些符号引用解析为直接引用。
- 类常量池在
.class文件中,由编译器生成,包含所有类相关的信息,如方法的描述符、常量值等。
3. 常量池的工作原理
- 编译时常量:如
final修饰的常量值,会在编译时存储到常量池中。 - 运行时常量:字符串字面量、常量表达式(如
1 + 2)等在运行时被添加到常量池。
4. 常量池与内存
- 堆外内存:字符串常量池是 JVM 堆外的内存区域,而类和方法的常量池是包含在每个类的
.class文件中的。
5. 常量池的优点
- 节省内存:通过共享常量池,避免重复创建相同的常量实例,提高内存使用效率。
- 提高性能:常量池中的常量在整个 JVM 运行期间可以共享,提高了代码的执行效率。
- 减少内存碎片:通过复用常量,减少了频繁的内存分配和垃圾回收的开销。
错误信息
常量池溢出:由于字符串常量池是有限制的,如果常量池中存储了过多字符串字面量,可能会遇到内存溢出。此时会抛出
OutOfMemoryError,错误信息如下:java.lang.OutOfMemoryError: PermGen space
总结
- 字符串常量池:存储所有字符串字面量,避免重复创建相同的字符串对象。
- 类和方法常量池:包含类、方法、字段的符号引用,在类加载时进行解析。
- 内存管理:常量池在堆外存储,通过共享常量对象节省内存并提高性能。
- 优点:减少内存占用、提高性能和内存回收效率。
常量池是 JVM 中的一项优化机制,广泛应用于字符串、常量和类的符号引用管理。
什么是 Java 中的常量池?的更多相关文章
- 【Java_基础】java中的常量池
1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...
- Java中的常量池
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
- java中Integer常量池
我们先看一个关于Integer的例子 public static void main(String[] args) { // TeODO Auto-generated method stu Integ ...
- Java中的常量池(字符串常量池、class常量池和运行时常量池)
转载. https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的 ...
- 19、java内存分配 常量池详解
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- 【万字图文-原创】 | 学会Java中的线程池,这一篇也许就够了!
碎碎念 关于JDK源码相关的文章这已经是第四篇了,原创不易,粉丝从几十人到昨天的666人,真的很感谢之前帮我转发文章的一些朋友们. 从16年开始写技术文章,到现在博客园已经发表了222篇文章,大多数都 ...
- Java字面常量与常量池
Java中的字面常量(区别于final创建的有名常量)通常会保存在常量池中,常量池可以理解为像堆一样的内存区域.但是常量池有一个特性就是,如果常量池中已存在该常量将不会再次为该常量开辟内存 还是看个程 ...
- jdk1.7中的常量池
在探究jdk1.7中的常量池,我们可以先看看以下的这段代码 public static void main(String[] args) throws Throwable { List<Stri ...
- 第46节:Java当中的常量池
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...
- 关于jvm中的常量池和String.intern()理解
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
随机推荐
- 自定义swagger扩展解析jsondoc
需求规定 为了减少注释和swagger注解的重复定义, 通过规范注释, 让swagger可以通过javadoc来产生 替换@Api.@ApiOperation.@ApiModel.@ApiModelP ...
- paddle安装中 libssl-1_1-x64.dll 的版本问题
paddle安装过程中出现的一些问题: 在学习tensorflow过程中,了解到paddlepaddle,本着技多不压身的原则也了解了一下,但是在安装的时候碰到了一些问题.特地记录一下. 一.&quo ...
- 从理房间到移动零:一道考察数组操作的经典题目|LeetCode 283 移动零
LeetCode 283 移动零 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有整理过房间?常常会发现一些要丢掉的东西,但又不想立刻处 ...
- 一个月狂赚百万?DeepSeek爆火背后的"卖铲人"狂欢
大家好,我是郭顺发,一个白天敲代码晚上写博客的独立开发者.最近有个叫DeepSeek R1的AI模型火得离谱--不是因为它技术多逆天,而是因为一堆人靠它一个月赚了几百万,而他们卖的东西...你绝对想不 ...
- linux mint 安装蓝牙
sudo apt-get install blueman 安装新的 sudo apt-get remove blueberry 卸载旧的
- Presto-JDBC使用
一.简介 PrestoConnection并不能提供一个持久的Socket连接,而是创建一个OkHttpClient与Presto按照HTTP1.1协议进行通信,并且PrestoConnection仅 ...
- npcap实战抓包教程
npcap 是一个用于 Windows 系统的网络抓包库,基于 WinPcap 的改进版本,支持最新的 Windows 特性和协议(如 IPv6).它通常与 Wireshark 或 Nmap 等工具一 ...
- [MQ] Kafka
概述: Kafka 安装指南 安装 on Windows Step1 安装 JDK JDK 安装后: 在"系统变量"中,找到 JAVA_HOME,如果没有则新建,将其值设置为 JD ...
- keil优化等级说明 keil code optimization
其中 0级(Constan folding)的优化包括: a.常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算. b. 简单访问优化:对8051系统的内部数据和位地 ...
- 文件快递柜FileCoxBox-匿名口令分享文本,文件,像拿快递一样取文件
FileCoxBox特色 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数 ...