常量池

对于常量池而言,字符串的概念较为广泛,并不单指字符串变量。类名、方法名、类型、this指针名,等等,都可以看作是字符串,最终都会被JVM当作字符串处理、存储到符号区。

由于无论是tag还是constantPool的数据区,一个存储位置只能存放一个指针宽度的数据,而字符串往往很大,因此JVM专门设计一个“符合表”的内存区,tag和constantPool数据区内仅保存指针指向符号区。

JVM对字符串的处理如下:


以上代码给出了一个基本思路,即字节码文件中的字符串常量池元素最终都会被保存到符号表中,为了节省内存,JVM会先判断符号表中是否存在相同的字符串,如果已经存在,则不会申请内存。这就是如果你在一个类中定义了两个字符串,但是这两个字符串的值相同,最终这两个字符串变量都会同时指向常量池中同一个位置的原因。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章解释了Java 虚拟机(JVM)的内部架构。下图显示了遵守Java SE 7 规范的典型的 JVM 核心内...
    饮墨飨书阅读 736评论 0 1
  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,103评论 5 44
  • 有了虚函数,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我...
    Bystander_1996阅读 127评论 0 0
  • JavaScript是什么 是一种运行再客户端(浏览器)的脚本语言 JS的作用 网页特效 表单验证 服务器端的JS...
    汐埋罗傲阅读 645评论 0 0
  • 从未想过时隔太久,再次去某个地方却都早已物是人非....... 去年总喜欢和霞霞在下班后拖着疲惫不...
    三笙A阅读 341评论 0 1