资讯专栏INFORMATION COLUMN

关于java的字符串常量池

mzlogin / 3182人阅读

摘要:字符串常量池字面量创建形式,检测这个字面量,这里我们认为没有内容为的对象存在。方法获得在常量池中的符号引用,如果常量池中没有该常量字符串,该方法会将字符串加入常量池。

字符串常量池

字面量创建形式,String str1 = “droid”; JVM检测这个字面量,这里我们认为没有内容为droid的对象存在。JVM通过字符串常量池查找不到内容为droid的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量str1

intern之后放入常量池

JDK7中的HotSpot VM没有把String常量放到native memory,而是把 interned String => Java heap ,把 Symbols => native memory

关于intern

在JDK6之前,常量池属于永久区的一部分,但在JDK7之后,被移动到堆中进行管理。String.intern()方法获得在常量池中的符号引用,如果常量池中没有该常量字符串,该方法会将字符串加入常量池。虽然String.intern方法的返回值永远等于字符串常量,但是不代表在系统的每时每刻,相同的字符串的intern返回都是一样的。(虽然在95%以上的情况下,都是相同的)。因为存在一种可能:在一次intern之后,该字符串在某一时刻被回收之后,再进行一次intern调用,那么字面量相同的字符串重新被加入常量池,但是引用位置已经不同。

问题

方法中new的String对象,在方法执行完之后,所引用的String对象还在么?

docs

Java中的字符串常量池

java用这样的方式生成字符串:String str = "Hello",到底有没有在堆中创建对象?

《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)

JDK7,HotSpot的String常量池放到了native memory,native memory是什么?

Java中几种常量池的区分

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65044.html

相关文章

  • 关于String.intern()和new StringBuilder("").

    摘要:对比较返回是因为这个字符串在执之前已经出现过,字符串常量池中已经有它的引用了,不符合首次出现的原则,而计算机软件这个字符串则是首次出现的,因此返回。 在《深入理解Java虚拟机》书中,提到在jdk1.7的版本中用String.intern()返回引用。 public class RuntimeConstantPoolOOM { public static void main(S...

    derek_334892 评论0 收藏0
  • 方法区到底是个什么鬼

    摘要:那方法区里都存着什么呢先抛结论静态变量常量类信息构造方法接口定义运行时常量池存在方法区中。动态常量池运行时常量池是方法区的一部分,是一块内存区域。文件常量池将在类加载后进入方法区的运行时常量池中存放。 一、方法区与永久代 这两个是非常容易混淆的概念,永久代的对象放在方法区中,就会想当然地认为,方法区就等同于持久代的内存区域。事实上两者是这样的关系: 《Java虚拟机规范》只是规定了有方...

    binaryTree 评论0 收藏0
  • 对于JVM,你就只知道堆和栈吗?

    摘要:下面的截图内容来自从规范我们可以看到,规范要求的运行时数据区域有程序计数器虚拟机栈堆方法区本地方法栈运行时常量池这及部分。查了一下,还是没有查到官方对于运行时数据区域的说明,但是许多博客都指出将字符串常量池移动到了堆中。 不少java程序员一提JVM运行时数据区域,就会说堆和栈,当然也有java程序员给出方法区、虚拟机栈、本地方法栈、堆、程序计数器这个答案,但是还有人给出永久代、虚拟机...

    王笑朝 评论0 收藏0
  • Java虚拟机中,符串常量到底存放在哪

    摘要:的三种常量池此外,有三种常量池,即字符串常量池又叫全局字符串池文件常量池运行时常量池。开始虚拟机把字符串常量池位置从永久代挪到堆,又彻底取消,把诸如之类的元数据都挪到堆之外管理。 前言 前阵子和朋友讨论一个问题: 字符串常量归常量池管理,那比如 String str = abc; abc这个对象是放在内存中的哪个位置,是字符串常量池中还是堆? 这句代码的abc当然在常量池中,只有n...

    lewinlee 评论0 收藏0
  • String内存模型,为什么String被设计成不可变

    摘要:证明返回常量池中已存在的对象,不等于新建的对象。为什么要设计成一下内容来自发现百度的中文版本基本也是此文的翻译版。总之,安全性和字符串常量池缓存是被设计成不可变的主要原因。 String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源标明最后,不确...

    vspiders 评论0 收藏0

发表评论

0条评论

mzlogin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<