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 中的常量池?的更多相关文章

  1. 【Java_基础】java中的常量池

    1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...

  2. Java中的常量池

    JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...

  3. java中Integer常量池

    我们先看一个关于Integer的例子 public static void main(String[] args) { // TeODO Auto-generated method stu Integ ...

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

    转载. https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的 ...

  5. 19、java内存分配 常量池详解

    在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...

  6. 【万字图文-原创】 | 学会Java中的线程池,这一篇也许就够了!

    碎碎念 关于JDK源码相关的文章这已经是第四篇了,原创不易,粉丝从几十人到昨天的666人,真的很感谢之前帮我转发文章的一些朋友们. 从16年开始写技术文章,到现在博客园已经发表了222篇文章,大多数都 ...

  7. Java字面常量与常量池

    Java中的字面常量(区别于final创建的有名常量)通常会保存在常量池中,常量池可以理解为像堆一样的内存区域.但是常量池有一个特性就是,如果常量池中已存在该常量将不会再次为该常量开辟内存 还是看个程 ...

  8. jdk1.7中的常量池

    在探究jdk1.7中的常量池,我们可以先看看以下的这段代码 public static void main(String[] args) throws Throwable { List<Stri ...

  9. 第46节:Java当中的常量池

    Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...

  10. 关于jvm中的常量池和String.intern()理解

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

随机推荐

  1. 自定义swagger扩展解析jsondoc

    需求规定 为了减少注释和swagger注解的重复定义, 通过规范注释, 让swagger可以通过javadoc来产生 替换@Api.@ApiOperation.@ApiModel.@ApiModelP ...

  2. paddle安装中 libssl-1_1-x64.dll 的版本问题

    paddle安装过程中出现的一些问题: 在学习tensorflow过程中,了解到paddlepaddle,本着技多不压身的原则也了解了一下,但是在安装的时候碰到了一些问题.特地记录一下. 一.&quo ...

  3. 从理房间到移动零:一道考察数组操作的经典题目|LeetCode 283 移动零

    LeetCode 283 移动零 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有整理过房间?常常会发现一些要丢掉的东西,但又不想立刻处 ...

  4. 一个月狂赚百万?DeepSeek爆火背后的"卖铲人"狂欢

    大家好,我是郭顺发,一个白天敲代码晚上写博客的独立开发者.最近有个叫DeepSeek R1的AI模型火得离谱--不是因为它技术多逆天,而是因为一堆人靠它一个月赚了几百万,而他们卖的东西...你绝对想不 ...

  5. linux mint 安装蓝牙

    sudo apt-get install blueman 安装新的 sudo apt-get remove blueberry 卸载旧的

  6. Presto-JDBC使用

    一.简介 PrestoConnection并不能提供一个持久的Socket连接,而是创建一个OkHttpClient与Presto按照HTTP1.1协议进行通信,并且PrestoConnection仅 ...

  7. npcap实战抓包教程

    npcap 是一个用于 Windows 系统的网络抓包库,基于 WinPcap 的改进版本,支持最新的 Windows 特性和协议(如 IPv6).它通常与 Wireshark 或 Nmap 等工具一 ...

  8. [MQ] Kafka

    概述: Kafka 安装指南 安装 on Windows Step1 安装 JDK JDK 安装后: 在"系统变量"中,找到 JAVA_HOME,如果没有则新建,将其值设置为 JD ...

  9. keil优化等级说明 keil code optimization

    其中 0级(Constan folding)的优化包括: a.常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算. b. 简单访问优化:对8051系统的内部数据和位地 ...

  10. 文件快递柜FileCoxBox-匿名口令分享文本,文件,像拿快递一样取文件

    FileCoxBox特色 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数 ...