【JVM之三】String与intern()方法

Java String常量池深度解析:intern()方法的内存优化艺术 Java中的String常量池是JVM优化字符串存储的特殊机制,核心是通过字符串驻留(interning)减少重复字符串的内存消耗。String常量池位于堆内存的方法区(Java 7前)或元空间(Java 8+)。当创建字符串时,JVM会检查常量池是否存在相同内容,使用intern()方法可手动将字符串存入常量池。合理使用intern()能显著降低内存占用,但过度使用可能导致性能下降或内存问题。适用场景包括处理大量重复字符串、长期存在的字符串(如缓存键)等,但不建议用于临时或唯一性字符串。Java各版本对i 阅读详情

哎呦,发现了一个总结的不错的blog:https://tech.meituan.com/in_depth_understanding_string_intern.html

JDK API文档中对intern()方法的描述是:返回字符串对象的规范化表示形式。一个初始为空的字符串池,它由类 String 私有地维护。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

String s = "123";  String s1 = new String("123"); 然而s == s1 么? 答案是不等于的。于是带着这个问题开始了下面的探究....... 

这两种初始化的方式有什么区别呢?

1. String s = "123";

首先会先去常量池看看有没有“123”,如果有的话,直接引用常量池对象就可以了,没有的话直接把对象放到常量池

2.String s = new String("123");

如果“123”第一次出现的话,会建两个对象,一个在堆里,一个在常量池里,如果不是第一次出现,那么新建一个在堆里面的对象。

下面来个例子理解理解:

public class Test {
    public static void main(String[] args) {    
        String a = "123";
        String Str = new String("123");
        String Str1 =new String("123").intern();
        System.out.println(a==Str);
        System.out.println(a==Str1);

    }

}
结果:
false
true

这里好创建了3个对象。

String a = "123";这里创建了1个对象 放在了常量池里。

String str = new String ("123"); 这里在堆里创建了 1个对象.

 String Str1 =new String("123").intern(); 在堆中new了一个对象,接着把常量池中有“123”的引用返回来了;

解释:

1.首先String a = "123"; 发现常量池没有“123”,在常量池里添加字符串123

2.String str = new String("123"); 首先在堆里新建一个对象,又发现常量池里已经有“123”了,那就不添加了。

3.String str1 = new String("123").intern(); 查询到常量池里有“123”,直接引用常量池对象.但是仍然会在堆里面创建一个对象,但是没有引用他。

 

总结:

String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个等于str的字符串并返回它的引用。

 

【JVM与内存调优】运行时常量池 与 String类的intern()方法 Java虚拟机对于Class文件每一部分(自然也包括常量池)的格式都有严格规定,如每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机认可、加载和执行,但对于运行时常量池,《Java虚拟机规范》并没有做任何细节的要求,不同提供商实现的虚拟机可以按照自己的需要来实现这个内存区域,不过一般来说,除了保存Class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。运行时常量池(Runtime Constant Pool)是方法区的一部分。 阅读详情

相关推荐

手把手教你用内核远程call实现64位进程注入(附完整ShellCode示例)

本文深入探讨了在Windows 64位环境下,通过内核态直接操作线程TrapFrame结构实现进程注入的高级技术。文章提供了从驱动框架设计、用户态-内核态通信,到定位修改TrapFrame、编写Shellcode及执行环境恢复的完整实战指南,并附有详细的代码示例,为安全研究人员和开发者提供了绕过用户态检测、实现底层远程代码执行的新思路。

weixin_28396629的博客 346

【JVM】对String::intern()方法深入详解(JDK7及以上)一文搞懂

String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。----书上描述已经包含。。。可能不太好理解。我画图解释方法的执行顺序肯定是从下向上依次执行的。

m0_51963973的博客 1245

debian mirrors 镜像源 riscv 64 赛昉 星光 starfive vf2 InRelease‘ doesn‘t support architecture ‘riscv64‘

debian mirrors 镜像 riscv 64 赛昉 星光2 starfive vf2 InRelease' doesn't support architecture 'riscv64'

qq_29758759的博客 1259

探究JVM(二)理解JDK 7 中的String.intern()

引言:String.intern() 被用来往字符串常量池中添加字符串,使得字符串的值可以复用,从而降低了内存开销。String.intern() 在JDK 7 中发生了重大变动,理解String.intern()改动后的原理能帮助我们正确使用它。

Yao_ziwei的博客 529

74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查

本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。

weixin_34046298的博客 313

Cgroup对进程所占用的CPU与内存资源同时进行限制的测试

测试环境:Ubuntu。处理器数量:1CPU。内存大小:2048MB。 以下是测试程序mem_cpu_test.c的代码。 将mem_cpu_test.c编译为可以运行的程序mem_cpu_test。 运行程序,并用top命令查看mem_cpu_test所占用的系统资源情况,可以看到,mem_cpu_test使用了50%左右的内存资源,也就是1000MB左右,并占用了接近全部的CPU资源。 关闭以上的程序后,在Cgroup子系统memory和cpu下分别创建进程组test1和test2。 并设置tes

qq_44998067的博客 1154

JVM字符串常量池及String的intern方法详解?

intern方法的作用 intern()方法的功能定义: (1)如果当前字符串内容存在于字符串常量池(即equals()方法为true,也就是内容一样),那直接返回此字符串在常量池的引用; (2)如果当前字符串不在字符串常量池中,那么在常量池创建一个引用并指向堆中已存在的字符串,然后返回常量池中的引用。 简单说intern方法就是判断并将字符串是否存在于字符串常量池,如果不存在则创建,存在则返回。 字符串常量池 在HotSpot中实现字符串常量池功能的是一个StringTable类,它是一个Hash表,默认

m0_60747279的博客 593

避坑指南:Docker部署PaddleOCR-VL服务时,关于flash-attn安装、端口映射和模型加载的那些坑

本文详细记录了Docker部署PaddleOCR-VL服务时遇到的常见问题及解决方案,包括flash-attn安装、GPU兼容性检查、容器生命周期管理、模型加载优化等关键环节。特别针对不同GPU架构提供了flash-attn的安装策略,并分享了端口映射、配置文件处理等实用技巧,帮助开发者高效避坑。

weixin_33686714的博客 463

Java String intern()方法

引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中。 如果不是用双引号声

xzgww0902的专栏 1270

VLA强化学习训练:π0到π0.5的技术优化与实现

视觉语言动作模型(VLA)作为多模态强化学习的重要分支,通过融合视觉、语言和环境状态数据实现智能决策。其核心技术在于多模态特征融合与动作空间设计,其中PPO算法因其出色的训练稳定性成为首选方案。在工程实践中,延迟补偿机制和课程学习设计能显著提升模型性能,如在四足机器人项目中使避障成功率提升47%。针对实际部署中的性能下降问题,需要特别关注硬件量化参数和控制频率一致性等关键因素。本文通过π0与π0.5版本的对比实验,详细解析了VLA模型在机械臂控制等具身智能场景中的优化路径。

weixin_29041767的博客 246

从NASA官网到分析图:MOD09A1地表反射率数据的完整处理流程(含QC筛选)

本文详细介绍了MOD09A1地表反射率数据的完整处理流程,从NASA官网数据下载到QC筛选,再到NDVI图生成。特别强调了质量控制(QC)信息在筛选可靠像元中的关键作用,帮助研究人员获取高质量遥感数据。

weixin_42542669的博客 111

深入谈谈String.intern()在JVM的实现

前言 String 类的intern方法可能大家比较少用也比较陌生,虽然实际项目中并不太建议使用intern方法,可以在 Java 层来实现类似的池,但我们还是要知道它的原理机制不是。 关于intern方法 通过该方法可以返回一个字符串标准对象,JVM 有一个专门的字符串常量池来维护这些标准对象,常量池是一个哈希 map 结构,字符串对象调用intern方法会先检查池中是否已经存在该字符串的标准对...

weixin_34192993的博客 347

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。

丨汀、的博客 7593

JVM-String:intern()方法

intern()的使用:   如果不是用双引号声明的String对象,可以使用String提供的intern方法:intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。   比如:String myInfo = new String(“I love atguigu”).intern();   也就是说,如果在任意字符串上调用String.intern方法,那么其返回结果所指向的那个类实例,必须和直接以常理形式出现的字符串实例完全相同。因此,下列表达式的值必定是tru

qq_42247286的博客 331

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《深入理解JVM》 探究String.intern()方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33836223的博客 203

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM-字符串常量池与String.intern()方法

文章目录1、字符串常量池在堆区还是在运行时常量池呢?2.String.intern()方法创建了几个对象?JDK6和JDK7下intern的区别3.使用intern 1、字符串常量池在堆区还是在运行时常量池呢? (1)首先介绍 运行时常量池在永久代(Permanent Generation)还是在元空间(meta-space)? 参考《深入理解Java虚拟机》 在JDK1.6(包含)之前,方法区(包含类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据,运行时常量池是方法区的一部分,包含了编译器生成的

weixin_44021967的博客 288

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

String类中intern方法的原理分析

一,前言 ​ 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法。本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今天就弥补昨天缺失的知识点。 二,String.intern() ​ 先来看下网上流行的关于intern()方法的示例代码: public static void main(String[] ...

a127389的博客 288

关于String类字符串在JVM的存储地址问题,结合字符串拼接、intern()方法的详细理解。

最近看了网上一些关于String的intern()方法的例子,以及字符串拼接的博客,彻底把我的思绪搞乱了,我对String的理解又被打回了原点,所以决定再一探究竟。 在开始正式探讨之前,我们先要回顾这几个知识点: String直接赋值与使用new的区别: 当String类直接赋值时,如果常量池内存在这个字符串,则s1直接指向常量池的地址,若没有,则先在常量池内创建这个字符串对象,s1直...

linlvting1314的博客 1078

最新从零开始学Java58之String字符串常量池和intern方法

Java专门为String类设计了一个缓存池intern pool,intern pool是在方法区中的一块特殊存储区域,当我们通过 String str=“yiyige” 这样的方式来构造一个新的字符串时,String类会优先在缓存池中查找是否已经存在内容相同的String对象。JDK 7 以后执行intern()方法时,如果发现字符串常量池中不存在该字符串字面量,则不会再拷贝一份字面量,而是拷贝字面量对应堆中的一个地址引用,然后返回这个引用。了解了常量池的内容之后,接下来请大家再跟着我们来看看。

2401_84301352的博客 916

从String.intern()来看Java内存模型及JVM

1,String.intern() 无论1.6还是1.7:String s = newString(“1”),生成了常量池中的“1” 和堆空间中的字符串对象。 jdk1.6之前,常量池是放在 Perm(永久代?) 区(属于方法区)中的,熟悉JVM的话应该知道这是和堆区完全分开的。 intern()方法在JDK1.6中的作用是:比如String s = new String(“SEU_Ca...

z285692001的博客 301

关于String.intern()的理解以及发现过程

记录理解String.intern()的过程: import org.junit.Test; /** * @ClassNmae:Junit * @Description:TODO * @Author:wang_uestc * @Date:2019/8/12 12:59 * @Version:1.0 **/ public class Junit { public static ...

u014361935的博客 136

JVM源码分析之String.intern()

只知道耗了多长时间,但是具体耗在了哪个阶段,是基本看不出来的,所以要么就是靠经验来定位,要。的时候,其实也没啥办法啦,因为你的数据量实在太大,桶子数就那么多,那每个桶再怎么均匀也会带。这个问题其实是我写这文章的时候突然问自己的一个问题,于是稍微想了下来跟大家解释下,因为大家。要回答这个问题我首先得问你们的机器到底有多少个核,如果核数很多的话,其实影响不是很大,因为。线程来做的,所以最多消耗一个核,因此看起来对于核数很多的情况,基本不。,经常会发一些在公司碰到的诡异问题的排查,相信会让你涨姿势的。

2301_77783312的博客 431

Java String在JVM内存中的分布

用一段代码来举例:为一个String对象赋值一个字符串字面量“test”:在启动项目时,在JVM类加载过程的“加载”阶段,当扫描到字节码文件中的“test”字面量时,JVM会把这个字面量存放在运行时常量池中。然后在“解析”阶段,JVM会根据运行时常量池中的这个字符串字面量,在堆中创建出对应的String类对象,然后再把它的引用值存入到字符串常量池中。

qq_66627105的博客 1850

通过比较JDK6和JDK7+中的String.intern()方法引出JVM常量池的区别

public class Main { public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern() == str1); String str2 = new StringBuilder("ja").append("va").toStrin

u010004734的博客 397

java中intern,在Java中什么时候使用String.intern()方法?

当中的String.intern()方法可以用来解决在Java中字符串的重复问题。通过使用intern()方法,可以节省大量由重复字符串对象消耗的堆内存。假如一个字符串对象包含与另一个字符串相同的内容,但是占用了不同的内存位置,例如str1!= str2但str1.equals(str2)true,则称其为重复。因为String对象在普通Java应用程序中消耗大量堆内存,因而使用intern()方...

weixin_39567222的博客 299

关于java的String一些问题(创建过程、intern()方法、字符串常量池),jdk6/jdk7/jdk8,详细到底层源码和jvm

关于java的String一些问题(创建过程、intern()方法、字符串常量池),jdk6/jdk7/jdk8,详细到底层源码和jvm

Xiaofeng_Lu__的博客 1261
上一篇: KMP算法
下一篇: 【JVM之二】垃圾回收
Joined
博客等级 码龄10年 19粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值