常量池、运行时常量池、字符串常量池

常量池、运行时常量池、字符串常量池

Java里包含各种常量池,经常傻傻分不清楚,下面就简单梳理下Java中的池们。

概念解释

常量池

这里的常量池指的是Class文件常量池。常量池里主要放两类常量:

  1. 字面量 :Java语言中定义的常量,如使用final修饰的值
  2. 符号引用 :表示JVM定义的Java关键字或基本类型与实际结构转换关系

符号引用主要包含以下三种类型:

  1. 类和接口的全限定名(Fully Qualified Name)

  2. 字段的名称和描述符(Descriptor)

  3. 方法的名称和描述符

上面说的常量池在JVM中的结构都是一张表。具体有哪些类型的表可以参考下图

常量池类型表.png

运行时常量池

运行时常量池就是类被JVM加载后在JVM中的版本。有一点儿区别就是常量池只有类文件在编译的时候才会产生,而且是存储在类文件中的。而运行时常量池是在方法区,而且可在JVM运行期间动态向运行时常量池中写入数据。

字符串常量池

字符串常量池是因为Java为String开辟的一块内存缓冲区,为了提高性能同时减少内存开销。在JVM中,字符串常量池由一个hash表实现。默认容量为1009。当字符串常量池中的存储比较多的字符串时,会导致hash冲突,从而每个节点形成长长的链表,导致性能下降。所以在使用字符串常量池时,一定要控制容量。

-XX:StringTableSize

通过这个参数可以指定字符串常量池的容量

不同Jdk中字符串常量池的演化

jdk6及以前字符串常量池中存放的是字符串常量
jdk7字符串常量池中存放的是指定字符串的引用

参考

  • <<深入理解Java虚拟机: JVM高级特性与最佳实践>>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,106评论 5 44
  • JVM中的字符串常量池是个有些玄幻的玩意儿,关于它的细节,各类书籍和网站上众说纷纭。本文试图参考尽量权威的资料,找...
    LittleMagic阅读 3,137评论 8 20
  • 概述 在分析字符串常量池之前,先来分析一下java的内存区域,然后再各种的情况分析一下各种情况下的情况; 在《深入...
    riverhh阅读 839评论 0 2
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,758评论 3 83
  • 《气质》理想篇 什么样的事业、足以让人在回顾一生辛劳的时候,感到足慰平生的幸福和自豪? 和一支这样的队伍在一起?是...
    读行人声阅读 490评论 0 0