文章目录

  • 引入:方法区常量池概述
  • 字符串常量池
  • class常量池
  • 运行时常量池

这里介绍 字符串常量池、class常量池 和 运行时常量池 这三个常量池的概念。

引入:方法区常量池概述

方法区包含运行时常量池、自动和方法数据、构造函数和普通方法的字节码内容、一些特殊方法。这里虽然没有具体说字符串常量池,但是它也是方法区的一部分。

在JDK1.8中,使用元空间代替永久代来实现方法区,但是方法区并没有改变,变动的只是方法区中内容的物理存放位置。正如上面所说,类型信息(元数据信息)等其他信息被移动到了元空间中;但是运行时常量池和字符串常量池被移动到了堆中。但是不论它们物理上如何存放,逻辑上还是属于方法区的。

关于关于为什么移除永久代?

  1. 字符串常量池存在永久代中,容易出现性能问题和内存溢出。
  2. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
  3. 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

字符串常量池

字符串常量池也叫全局字符串池或者String Pool。
全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的)。

在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是字符串的引用。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。

这里字符串常量池里的字符串实际上是驻留字符串
驻留的英文是Interning,这和代码上new String("abs").intern()的intern方法是一个意思,就是拿到“abs”字符串在字符串常量池里的引用,这个指定abs字符串在字符串常量池的唯一引用就是驻留
通过intern()方法,实际上"abs"==new String("abs").intern()这个布尔结果就是true,而"abs"==new String("abs")的结果是false。

class常量池

准确的来说,它不叫class常量池,而是Class文件的常量池表(Constant Pool Table)Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池表,它用于存放编译器生成的各种字面量与符号引用。

字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可(它与直接引用区分一下,直接引用一般是指向方法区的本地指针,相对偏移量或是一个能间接定位到目标的句柄)。

一般包括下面三类常量:

  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符

运行时常量池

当java文件被编译成class文件之后,也就是会生成我上面所说的class常量池,那么运行时常量池又是什么时候产生的呢?

jvm在执行某个类的时候,必须经过加载、验证、准备、解析、初始化这样的类加载过程。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中。由此可知,同class文件的常量池表一样,运行时常量池也是每个类都有一个

运行时常量池是运行时加载的,而class文件常量池表是在编译时期确认的,当字节码文件被加载进入内存并经过类的解析阶段之后,这个类的运行时常量池才会产生。而经过解析(resolve)之后,也就是把符号引用替换为直接引用,解析的过程会去查询全局字符串池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与全局字符串池中所引用的是一致的。

Java常量池详解:字符串常量池、Class常量池、运行时常量池 三者关系相关推荐

  1. JVM——字符串常量池详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串.作为最常用也是 ...

  2. JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了

    JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了! 常量池详解 1. 字面量和符号引用 1.1 字面量 1.2 符号引用 2. 常量池vs运行时常量池 3. 常 ...

  3. 详解JVM常量池、Class常量池、运行时常量池、字符串常量池(心血总结)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  4. python中常量池和堆_JVM详解之:运行时常量池

    简介 JVM在运行的时候会对class文件进行加载,链接和初始化的过程.class文件中定义的常量池在JVM加载之后会发生什么神奇的变化呢?快来看一看吧. class文件中的常量池 之前我们在讲cla ...

  5. JVM详解之:运行时常量池

    文章目录 简介 class文件中的常量池 运行时常量池 静态常量详解 String常量 数字常量 符号引用详解 String Pool字符串常量池 总结 简介 JVM在运行的时候会对class文件进行 ...

  6. 运行时常量池在哪里_Java虚拟机详解(二)------运行时内存结构

    首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生 ...

  7. jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃 ...

  8. 方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?

    方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存,它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆. 1.此区域是线程共享的.储存已加载的类型信息.常 ...

  9. class常量池、运行时常量池 和 字符串常量池 的区别

    文章目录 一.概念 1.class常量池(Constant Pool) 1.1.字面量 1.2.符号引用 2.Runtime Constant Pool( 运行时常量池 ) 3.String Pool ...

  10. 简单理解常量、常量池、运行时常量池和字符串常量池

    1.常量 常量在java中就值的是一般的字面量,比如字符串,整数,浮点数等等数据.简单理解java中什么叫常量 2.常量池,也叫静态常量池或者class文件常量池,说常量池一定要指明是编译器产生的.它 ...

最新文章

  1. 如何使用ModelSim作前仿真與後仿真? (真oo无双前辈)
  2. 学会和同事相处的30个原则
  3. Hyper-V 的导入和导出
  4. mybatis 缓存总结以及遇到的问题
  5. Docker两个问题的讨论
  6. 数据库表命名 单数复数_数据是还是数据是? “数据”一词是单数还是复数?
  7. 微信小程序 调用地图接口,实现定位
  8. LeetCode 992. K 个不同整数的子数组(双指针)
  9. Linux学习笔记:Linux常用命令操作
  10. CentOS升级Python到2.7版本
  11. GridView导出Execl
  12. 数据科学(data science)概览
  13. vs2017可以写python_『vs python 使用教程』怎么用VS2017写一个最简单的Python程序,比如hello world?...
  14. 网页设计html5留言板代码,web网页设计期末大作业_留言板制作.doc
  15. Ruby语言快速入门
  16. NetLog 大规模应用实战:Database-sharding 技术
  17. Linux网络操作命令
  18. 怎么在qq空间引流?QQ空间生日栏怎么引流?
  19. javascript适合移动端的响应式瀑布流插件实例演示
  20. R语言报错:Error in data[[rowvar]] : attempt to select less than one element in get1index

热门文章

  1. 书店管理系统课程设计( sql server+python)
  2. html分辨手机电脑,html自动识别手机或者pc端
  3. 家庭记账的最简单方法
  4. Java Deque
  5. Linux 下使用rinetd工具实现端口转发
  6. springBoot整合tkMybatis
  7. matlab矩阵排序sort,MATLAB数组元素的排序
  8. 游戏开发关卡设计(16)
  9. Nginx 限流配置-令牌桶算法
  10. SSM框架整合以及使用思路梳理