java的常量池

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


前言

java中有字节码中的常量池、运行时常量池、字符串常量池三张常量池,语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd

为甚要有常量池

public class Demo1 {
    public static void main(String[] args) {
        System.out.println("123");
        System.out.println(UUID.randomUUID().toString());
    }

}

一个.java文件只有几行代码,但其加载时却需要依赖很多东西,像Objec类、System、UUID、String、toString()方法、println()方法等,这些信息不可能全部编译到对应的.class文件中,也不能全部方到Demo1的元数据中,所以就引入了常量池这个概念,常量池可以看做是一张表,虚拟机指令可以根据这张表找到要执行的类、方法、属性、参数类型、返回值类、字面量型等引用信息。

字节码中的常量池

将一个.class文件用javap命令反编译后,发现生成的文件中最大的结构叫Constant pool这就是我们所说的字节码中的常量池,其主要内容是字面量(文本字符串、声明为final的常量值)、符号引用(类和接口的全限定名、字段的名称和描述符、方法的名称和描述符)。
列:

Constant pool:
   #1 = Methodref          #13.#47        // java/lang/Object."<init>":()V
   #2 = String             #48            // String
   #3 = Fieldref           #6.#49         // jvm/memory/loading/Person.a:Ljava/lang/String;
   #4 = Fieldref           #6.#50         // jvm/memory/loading/Person.b:I
   #5 = Fieldref           #6.#51         // jvm/memory/loading/Person.finalStr1:Ljava/lang/String;
   #6 = Class              #52            // jvm/memory/loading/Person
   #7 = String             #53            // final String
   #8 = Fieldref           #6.#54         // jvm/memory/loading/Person.staticStr:Ljava/lang/String;
   #9 = Fieldref           #6.#55         // jvm/memory/loading/Person.staticInt:I
  #10 = Methodref          #56.#57        // java/util/UUID.randomUUID:()Ljava/util/UUID;
  #11 = Methodref          #56.#58        // java/util/UUID.toString:()Ljava/lang/String;
  #12 = String             #59            // static String
  #13 = Class              #60            // java/lang/Object
  #14 = Utf8               finalStr1
  #15 = Utf8               Ljava/lang/String;
  #16 = Utf8               finalStr2
  #17 = Utf8               ConstantValue
  #18 = Utf8               staticStr
  #19 = Utf8               staticInt
  #20 = Utf8               I
  #21 = Utf8               a
  #22 = Utf8               b
  #23 = Utf8               <init>
  #24 = Utf8               ()V
  #25 = Utf8               Code
  #26 = Utf8               LineNumberTable
  #27 = Utf8               LocalVariableTable
  #28 = Utf8               this
  #29 = Utf8               Ljvm/memory/loading/Person;
  #30 = Utf8               getFinalStr1
  #31 = Utf8               ()Ljava/lang/String;
  #32 = Utf8               getFinalStr2
  #33 = Utf8               getStaticStr
  #34 = Utf8               setStaticStr
  #35 = Utf8               (Ljava/lang/String;)V
  #36 = Utf8               getStaticInt
  #37 = Utf8               ()I
  #38 = Utf8               setStaticInt
  #39 = Utf8               (I)V
  #40 = Utf8               getA
  #41 = Utf8               setA
  #42 = Utf8               getB
  #43 = Utf8               setB
  #44 = Utf8               <clinit>
  #45 = Utf8               SourceFile
  #46 = Utf8               Person.java
  #47 = NameAndType        #23:#24        // "<init>":()V
  #48 = Utf8               String
  #49 = NameAndType        #21:#15        // a:Ljava/lang/String;
  #50 = NameAndType        #22:#20        // b:I
  #51 = NameAndType        #14:#15        // finalStr1:Ljava/lang/String;
  #52 = Utf8               jvm/memory/loading/Person
  #53 = Utf8               final String
  #54 = NameAndType        #18:#15        // staticStr:Ljava/lang/String;
  #55 = NameAndType        #19:#20        // staticInt:I
  #56 = Class              #61            // java/util/UUID
  #57 = NameAndType        #62:#63        // randomUUID:()Ljava/util/UUID;
  #58 = NameAndType        #64:#31        // toString:()Ljava/lang/String;
  #59 = Utf8               static String
  #60 = Utf8               java/lang/Object
  #61 = Utf8               java/util/UUID
  #62 = Utf8               randomUUID
  #63 = Utf8               ()Ljava/util/UUID;
  #64 = Utf8               toString

什么是符号引用

以一组符号来表示被引用的目标,符号可以是任何新式的字面量,只要能无歧义的表示被引用目标即可,符号引用于jvm的内存布局无关,被引用的目标并不一定被加载到内存。

运行时常量池

当.class文件被加载后,字节码的各部分信息都会被解析转换池类的元数据信息保存在方法区,当然也包括字节码中的常量池(在jvm中一个类对应一个运行时常量池)。虚拟机会将字节码常量池中的符号引用转换为直接引用,并翻译到具体的内存地址中。

什么是直接引用

直接引用即直接执行引用目标的指针、相对偏移量或者一个能间接定位到目标的句柄,直接引用是与jvm的内存内存布局相关的,如果有了直接引用说明引用的目标已经被加载到内存中了,如果尚未开辟内存空间则无法获取直接引用。

字符串常量池

字符串常量池在jdk1.6是位于方法区(永久带),在jdk1.7以后移动到了堆中,字符串常量池整个jvm进程只有一份,保存了全部字符串的直接引用。运行时常量池每个类都有一份,其中在解析运行时常量池中字符串字面量的直接引用时会和全局的字符串常量池做比较保证一致。

字符串常量池为什么要移动到堆中

原先字符串常量池在方法区(永久带)中,由于方法区只有在full GC时才会被回收,full GC只有在方法区或者老年代满了时才会触发,一个系统中会用到大量字符串,继而导致字符串常量池中很多无用字符串得不到回收,浪费了方法区的空间。所以才会将字符串常量池转移到堆中,降低GC成本,提供空间利用率。

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

相关推荐

上下文理解的AI增强方案:AI应用架构师的架构洞察

本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 218

java常量池详解

s0还是常量池 中"zhangsan”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”zhangsan”的引用,s2因为有后半部分 new String(”san”)所以也无法在编译期确定,所以也是一个新创建对象”zhangsan”的引用;所以此时的"a" + bb和"a" + "b"效果是一样的。分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。

weixin_43134177的博客 2620

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。

weixin_53499537的博客 1496

Java 常量池

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

IT__learning的博客 7889

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 275

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

Java常量池

字符串常量池

qq_54247497的博客 862

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 783

深度剖析Java常量池

深度剖析Java常量池

zhangzhigan1202的博客 2748

原生H5如何优雅拦截浏览器返回事件:全面屏侧滑退出的解决方案

本文深入探讨了在原生H5中如何优雅地处理浏览器返回事件,特别是针对全面屏手机侧滑返回手势的解决方案。核心是利用HTML5 History API,通过`history.pushState`方法在历史栈中插入记录,并监听`popstate`事件,从而实现在用户侧滑时平滑关闭全屏预览层而非直接退出页面,有效提升了移动端H5应用的原生交互体验。

i0j1k2l3m的博客 268

不用SE63逐个翻译!ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量处理TCODE描述的3种姿势

本文介绍了三种利用ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量翻译SAP事务码(TCODE)描述的高效方案,旨在替代SE63逐个翻译的低效操作。内容涵盖从基础循环、Excel导入到全自动程序集成的实现方法,帮助开发者显著提升批量翻译效率,并深入解析了SAP翻译体系的核心原理与实战技巧。

weixin_42593130的博客 659

java 常量池详解

java、jvm、常量池、虚拟机

李帅的博客 1874

[RK3568 Android11] 开发之调试RK809 codec音频-SPK喇叭

目录 前言 一、注册声卡顺序 二、SPK喇叭路由配置 三、tinyalsa调试工具 前言 瑞芯微RK809是一种复杂的功率管理集成电路(PMIC)集成编解码器,适用于由外部电源供电的多核系统应用;同时它也集成了音频编解码器,这样在硬件设计上可以直接使用RK809 codec功能,不必再外挂个其他codec芯片;RK809 codec不仅支持SPK,还支持耳机,MIC功能; 一、注册声卡顺序 设备树dts里面原厂帮我们配置好了rk809_sound,我们直接...

~未来可期~ 7412

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

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

ZhuMin_ChosenOne的博客 4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_33148993的博客 2952

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

2201_75353178的博客 1409

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java常量池

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

GzlAndy的博客 661

Java 中的常量池

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

weixin_43521001的博客 1113

java中常量池

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

a141210104的专栏 1188

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几种常量池区分(字符串常量池、class常量池和运行时常量池)

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

Syntactic Sugar 1961

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

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

向上的"狼"的博客 3729

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

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

weixin_39872395的博客 3305

Java运行时常量池

概述 1.常量池在内存中的位置: 在JDK1.6中,方法区是以永久代的方式实现(HotSpot),常量池是方法区的一部分。 在JDK1.7中,方法区合并到堆内存中,常量池可以说在堆内存中。 在JDK8中,方法区又被剥离出来,只不过实现方式不是永久代,此时的方法区叫元数据区,常量池也就在元数据区。 2. 常量池的概念以及作用 通常来讲,所有变量,包括基本类型和引用类型,他们都存在虚拟机栈中,包括变量类型、变量名称、和变量值。对于基本类型来说,值就是具...

weixin_44250483的博客 6786

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

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

祁东握力的博客 699
上一篇: jvm类加载子系统之链接阶段
下一篇: jvm类加载子系统之类的初始化
躺平程序猿
博客等级 码龄8年 4870粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值