首页
学习
活动
专区
圈层
工具
发布

字符串常量池_字符串常量池溢出

而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。...如果不存在,则在字符串池中创建”aaa”这个对象,然后将池中”aaa”这个对象的引用地址返回给字符串常量str1,这样str1会指向池中”aaa”这个字符串对象;如果存在,则不创建任何对象,直接将池中”...” 常量,并且直接将这个常量放入字符串池中,这样做实际上是一种优化,将3个字面量合成一个,避免了创建多余的字符串对象。...v = originalValue; 从中我们可以看到,虽然是新创建了一个String的实例,但是value是等于常量池中的实例的value,即是说没有new一个新的字符数组来存放”123″。...其内部的字符数组长度可变)。

87440
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    jvm字符串常量池_java 常量池

    字符串 字符串字面量:就是指这个字符串本身,比如”Java”,”Hello”。...字符串对象:比如new String(“abc”),或者直接String s=”str”,后面的”str”也是一个字符串对象。 字符串引用:引用就是一个变量,指向对应的字符串对象。...这两项就是java和abcd这两个字符串的字面量。 而符号引用也是一些常量,比如全限定类名,字段的名称和描述符,方法的名称和描述符。 这是类名。 这是变量名。...c=”java”; String d=”abcd”; String e=”java”; String f=new String(“java”); } } 运行时常量池 && 字符串常量池 class常量池被加载到内存后...意思是当一个字符串对象调用intern方法,如果池中已经存在值相等(通过String的equal函数比较)的字符串常量,就返回常量池中的常量,也就是堆中对应实例的引用。否则将这个字符串加入常量池。

    78120

    jvm常量池和字符串常量池_常量池中的字符串是对象吗

    JVM层面提供了字符串常量池。...实现原理 为了提高性能并减少内存的开销,JVM在实例化字符串常量时进行了一系列的优化操作: 在JVM层面为字符串提供字符串常量池,可以理解为是一个缓存区; 创建字符串常量时,JVM会检查字符串常量池中是否存在这个字符串...; 若字符串常量池中存在该字符串,则直接返回引用实例;若不存在,先实例化该字符串,并且,将该字符串放入字符串常量池中,以便于下次使用时,直接取用,达到缓存快速使用的效果。...当然,对于JDK1.8时,HostSpot VM对JVM模型进行了改造,将元数据放到本地内存,将常量池和静态变量放到了Java堆里。...元空间 JDK 1.8, HotSpot JVM将永久代移除了,使用本地内存来存储类的元数据信息,即为元空间(Metaspace) 所以,字符串常量池的具体位置是在哪里?

    85320

    Java字符串常量池_字符串常量池溢出

    在Java的内存分配中,总共3种常量池: Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池 1.字符串常量池(String Constant Pool...) 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆...在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。...中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的) 如何将String对象放入到常量池 “abc” 双引号String 对象会自动放入常量池 调用String的intern...Integer 对象池在底层实际上就是一个变量名为 cache 的数组,里面包含了 -128 ~ 127 的 Integer 对象实例。

    1.5K30

    Jvm常量池、运行时常量池、字符串常量池理解

    字符串常量池(string pool) 字符串常量池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string...在jdk1.8后,将String常量池放到了堆中。 String table还存在一个hash表的特性,里面不存在相同的两个字符串,默认容量为1009。...当字符串常量池中的存储比较多的字符串时,会导致hash冲突,从而每个节点形成长长的链表,导致性能下降。所以在使用字符串常量池时,一定要控制容量。...s3=s6输出true 简单介绍intern方法,可以使用intern方法,主动将串池中还没有的字符串对象放入字符串常量池 通过intern方法主动将s4的字符串放入了字符串常量池,将这个字符串对象尝试放入串池...1.6将这个字符串对象尝试放入串池,如果有则不会放入,如果没有会把此对象复制一份,会把串池中的对象返回。

    2.3K31

    Java中的常量池【Class常量池、运行时常量池、字符串常量池】

    运行时常量池相对于Class文件常量池的另一个重要特征是具备动态性,Java语言并不要求常量一定只在编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量池放入池中...在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。...字符串常量池 字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前的版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量被移到了堆中。...字符串常量池是什么?...在之前版本中,里放的都是字符串常量 在中,由于发生了改变,因此中也可以存放放置在堆内的字符串对象的引用。

    2.2K20

    运行时常量池与字符串常量池_常量池是什么

    2)运行时常量池存在什么地方? 3)取消永久代后,方法区的实现? 4)字符串常量池和运行时常量池究竟去了哪里? 4)元空间是什么? 5)关于为什么移除永久代?...话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。 1)方法区包含哪些内容?...一些特殊方法 这里虽然没有说明“字符串常量池”,但是它也是方法区的一部分。...4)字符串常量池和运行时常量池究竟去了哪里?...因此,可以大致验证 JDK 1.7 和 1.8 将字符串常量由永久代转移到堆中 4)元空间是什么? 元空间的本质和永久代类似,都是对JVM规范中方法区的实现。

    72320

    字符串常量池

    我直接否定了三妹的答案,“使用 new 关键字创建一个字符串对象时,Java 虚拟机会先在字符串常量池中查找有没有‘二哥’这个字符串对象,如果有,就不会在字符串常量池中创建‘二哥’这个对象了,直接在堆中创建一个...‘二哥’的字符串对象,然后将堆中这个‘二哥’的对象地址返回赋值给变量 s。”...“如果没有,先在字符串常量池中创建一个‘二哥’的字符串对象,然后再在堆中创建一个‘二哥’的字符串对象,然后将堆中这个‘二哥’的字符串对象地址返回赋值给变量 s。”...“三妹”这个字符串对象,如果有,则不创建任何对象,直接将字符串常量池中这个“三妹”的对象地址返回,赋给变量 s;如果没有,在字符串常量池中创建“三妹”这个对象,然后将其地址返回,赋给变量 s。...“那关于字符串常量池,就先说这么多吧,是不是还挺有意思的。”我说。 “是的,我现在是彻底搞懂了字符串常量池,哥,你真棒!”三妹说。

    69640

    字符串常量池 运行时常量池_常量池中的字符串是对象吗

    jdk7是JVM内存区域发生了变化,将方法区放到了直接内存中,而字符串常量池放到了堆空间当中。...intern() 方法 说明 intern()是一种手动将字符串加入常量池中的方法,其优点是执行速度非常快,直接使用==进行比较要比使用equals()方法快很多;内存占用少。...char[]中的内容进行了复制,然后将复制的引用返回。...在调用了intern方法后将”11″加入到常量池中,再此之前常量池是没有”11″的,该方法返回的结果是常量池中的引用 而s4直接就是字符串常量池中的引用 最后进行比较,s3是String类型对象引用,s4...如果存在,String对象会被调整引用那个数组,释放对原来的数组的引用,最终会被垃圾收集器回收掉。 如果查找失败,char数组会被插入到Hashtable,这样以后的时候就可以共享这个数组了。

    55620

    常量池之字符串常量池String.intern()

    执行intern()方法时,若常量池中不存在等值的字符串,JVM就会在常量池中 创建一个等值的字符串,然后返回该字符串的引用。 2. “”(引号)引起来的内容(字面量)。     ...引号引起来的字符串,首先从常量池中查找是否存在此字符串,如果不存在则在常量池中添加此字符串对象,然后引用此字符串对象。如果存在,则直接引用此字符串。...通过调用intern()方法,会在常量池中生成一个相同字符串的对象 “”内的字符串都会添加到常量池中,相当于引用的方法区中的字符串对象。...“”内的字符串实例引用会添加到常量池中(前提:常量池中没有相同内容的字符串),如果常量池中存在,则引用常量池中的对象(防止重复创建对象)。...方法名meme就会以字符串的方式加入到字符串常量池中,所以会感觉常量池中会内置很多字符串常量。

    1.3K70

    精通Excel数组公式008:数组常量

    图4:数组常量:使用列填充行,逗号=列。...图14 这些值虽然是文本,但应用到数学运算中后,会自动转换为数字。这样,得到的求净成本的公式如下图15所示。 ?...示例:在VLOOKUP函数中的查找技巧 使用数组常量来节省工作表空间 在使用VLOOKUP函数时,如果你不想通过查找表查找且数据不会变化,可以将查找表硬编码到公式中,如下图16所示。 ?...图16 使用名称 除了按上述方法在公式中列出查找表的所有数据外,还可以将数组常量定义为名称并在公式中使用。如下图17所示,定义名称包含查找表数据。 ?...图21 因为是求和,所以可以将VLOOKUP函数放置到SUMPRODUCT函数中,这样可以避免按Ctrl+Shift+Enter键,如下图22所示。 ?

    4.3K20

    C语言字符串常量

    C语言字符串常量 一.字符串常量的声明 char *p = "hello";//指针直接往上戳 一个字符串常量为什么会给一个指针赋值? ...字符串常量是一个表达式,既然使表达式就会有值,字符串常量的值是该字符串第一个字母的首地址 同一个字符串常量,它们的值(地址)相同 #include ...,输出的结果却一样,这就说明多次使用同样内容的字符串常量,在内存中,都只保存一次该字符串常量。...return 0; } 二.注意事项 1.字符串常量和字符数组不同...2.如果要修改字符串的值,我们只能使用字符数组的形式来存储字符串,可以这样声明:char str[] = "hello";,这样就可以修改了,它两本质上的不同是存储的位置不同。

    6.4K20

    Python进阶:如何将字符串常量转为变量?

    简单理解,这个问题的意思是,将字符串内容作为其它对象的变量名。 list 中的元素是字符串,此处的 ‘A’-‘D’ 是常量 ,而在要求的结果中,A-D 是变量 。...如果强行直接将常量当做变量使用,它会报错: >>> 'A' = [] ...SyntaxError: can't assign to literal 报错中的literal 指的是字面量 ,这是计算机科学中常见的一个概念...globals() 方法取出来的是一个字典,字符串 ‘A’ 是其中一个键值(key),而这个键值恰恰是全局命名空间中的一个变量,这就实现了从常量到变量的转化。...也就是说,因为字符串常量的内容被当做有效代码而执行了,其中的 'A'-'D' 元素,就取得了新的身份,变成了最终的 A-D 变量名。...4、总结 抽象一下最初的问题,它实际问的是“如何将字符串内容作为其它对象的变量名”,更进一步地讲是——“如何将常量转化为变量 ”。 使用直接进行赋值的静态方法,行不通。

    4.6K20

    字符串常量池概述

    字符串常量池概述 常量池表(Constant_Pool table) Class文件中存储所有常量(包括字符串)的table。...字符串常量池(String Pool) 字符串常量池与运行时常量池不是一个概念: String Pool 是JVM 实例全局共享的全局只有一个,而Runtime Constant Pool 每个类都有一个...字符串池在JDK 1.7 之后存在于Heap 堆中,旧版存在于方法区中 【亨元模式】 其实字符串常量池这个问题涉及到一个设计模式,叫“享元模式”,顾名思义 – – – > 共享元素模式 也就是说:一个系统中如果有多处用到了相同的一个元素...Java中String部分就是根据享元模式设计的,而那个存储元素的地方就叫做“字符串常量池 – String Pool” 【详细分析】 首先, 10 和 “hello” 会在经过javac(或者其他编译器...步骤如下: 在Java Heap(堆)中根据”hello”字面量create一个字符串对象 将字面量”hello”与字符串对象的引用在hashtable中关联起来 键 – 值 形式是:“hello”

    48430

    Class常量池、运行时常量池、字符串常量池的一些思考

    Class常量池、运行时常量池、字符串常量池 class常量池 java代码经过编译之后都成了xxx.class文件,这是java引以为傲的可移植性的基石。...Hotspot虚拟机为例 在1.6运行时常量池以及字符串常量池存放在方法区,此时Hotspot对于方法区的实现为永久代(关于是否属于堆内存https://www.zhihu.com/question/49044988...)永久代属于GC heap的一部分 在1.7字符串常量池被从方法区拿到了堆,运行时常量池还留在方法区中 在1.8中hotspot移除了永久代用元空间取代它,字符串常量池还在堆中,而运行时常量池依然在方法区也就是元空间...(堆外内存) 字符串常量池 为了减少频繁创建相同字符串的开销,JVM弄了一个String Pool,它是全局共享的,整个JVM独一份,与之对应的有一个StringTable,,简单来说它就是一个Hash...Map,key--字符串字面量,value--指向真正的字符串对象的指针。

    46520
    领券