基于JDK1.8 分析运行时常量池、字符串常量池、各种常量池

发布时间:2021-12-03 18:18:31

?


Java中的常量池分为三种类型:


类文件中常量池(The Constant Pool)运行时常量池(The Run-Time Constant Pool)String常量池

?


类文件中常量池 ---- 存在于Class文件中

所处区域:堆


诞生时间:编译时


内容概要:符号引用和字面量


class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量的符号引用。


常量池中存放的是符号信息,java虚拟机在执行指令的时候会依赖这些信息。常量池中的所有项都具有如下通用格式:


cp_info {
u1 tag; //表示cp_info的单字节标记位
u1 info[]; //两个或更多的字节表示这个常量的信息,信息格式由tag的值确定
}

Constant TypeValue
CONSTANT_Class7
CONSTANT_Fieldref9
CONSTANT_Methodref10
CONSTANT_InterfaceMethodref11
CONSTANT_String8
CONSTANT_Integer3
CONSTANT_Float4
CONSTANT_Long5
CONSTANT_Double6
CONSTANT_NameAndType12
CONSTANT_Utf81
CONSTANT_MethodHandle15
CONSTANT_MethodType16
CONSTANT_InvokeDynamic18

举几个典型的例子来说明常量池中数据是如何存储的:


CONSTANT_Class结构 -- 表示类或者接口,他的格式如下:


CONSTANT_Class_info {
u1 tag; //这个值为 CONSTANT_Class (7)
u2 name_index;//注意这是一个index,他表示一个索引,引用的是CONSTANT_UTF8_info
}

注意观察 这个CONSTANT_Class_info类型的常量内部结构是由一个tag(CONSTANT_Class(7))和一个name_index组成,name_index中注意这个index,他表示一个索引的,什么的索引呢?CONSTANT_Utf8_info结构的索引,这个结构用来表示一个有效的类或者接口的二进制名称的内部形式。class文件结构中出现的类或者接口名称都是通过全限定形式来表示的,也被称作二进制名称【题外话:全限定类名含义就类似 java.lang包中定义的Object类的完全限定名称为java.lang.Object】。


那我们接着看CONSTANT_Utf8_info结构,他用于表示字符常量的值,他的结构如下所示:


CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}

我们注意到第一个tag肯定表示为:CONSTANT_Utf8(1);后面的length指明了bytes[]数组的长度;最后一个bytes[]数组引用了上一个length作为其长度。字符常量采用改进过的UTF-8编码表示。


?


运行时常量池 ----?存在于内存的元空间中

诞生时间:JVM运行时


内容概要:class文件元信息描述,编译后的代码数据,引用类型数据,类文件常量池。


所谓的运行时常量*涫稻褪墙嘁牒蟮睦嘈畔⒎湃朐诵惺钡囊桓銮蛑校美炊袢±嘈畔ⅰ


运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。


字符串常量池 ---- 存在于堆中

从上述结果可以看出,JDK 1.6下,会出现“PermGen Space”的内存溢出,而在 JDK 1.7和 JDK 1.8 中,会出现堆内存溢出,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效。因此,可以大致验证 JDK 1.7 和 1.8 将字符串常量由永久代转移到堆中,并且 JDK 1.8 中已经不存在永久代的结论。


字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的)。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。


https://www.cnblogs.com/dennyzhangdd/p/6770188.html


?

相关文档

  • 销售部门月度工作计划怎么写
  • vivo手机拨号代码大全
  • Programming in Objective-C 学习笔记07??Foundation框架基础01
  • 信用卡换卡前一定要还清吗
  • 职场有趣搞笑幽默段子
  • 包子怎么蒸 包子的做法大全
  • 英语四级阅读答题技巧
  • 小学消防安全教育培训知识
  • 学校开学督导自查报告
  • android studio 写相册
  • 大码女装广告词
  • 写人细节描写片段摘抄
  • 魅族5s屏幕动不得怎么办
  • 六年级毕业语文综合复习题
  • 有关助理的工作内容
  • 凌科芯安LKT与目前市场上几种安全加密芯片的对比
  • 初一英语作文:我最喜欢的一本书
  • 华为手机充电时电池异常
  • 冬天养生茶推荐
  • 莲子心泡水喝的作用
  • 怎么测试电脑是否有mysql_怎么查看电脑是否有mysql?
  • 初一年级英语作文:The most interesting th
  • 少女绘画素描图片
  • 穷举法百钱白鸡matlab,郑州轻工业大学oj题解(c语言)1074: 百钱买百鸡 穷举法(一)...
  • 糖尿病预防与保健糖尿病预防保健知识
  • 2015 2016年小学三年级寒假作业数学
  • 饭后多久可以运动不会得阑尾炎 阑尾炎饭后多久运动好
  • 计算机网络安全怎样维护
  • 日语教材编制中的词汇处理论文
  • 会计个人工作计划怎么写
  • 猜你喜欢

  • 高炉瓦斯泥浮选碳工艺试验研究
  • 第2-2章风险与收益-PPT精品文档
  • 【推荐-教案】《钓鱼的启示》第二课时.doc
  • 客运公司宣传片文案
  • 2019年精选苏教版初中语文八年级上册练*题第七十二篇
  • 桥式起重机车轮直径选用的探讨
  • 《戏题王宰画山水图歌》翻译赏析
  • 2010年永嘉县初中升学考试第一次模拟试卷数学试题卷
  • 韶山主要美食汇总及做法
  • 福建省明建宏工程咨询有限公司电力工程造价咨询分公司企业信用报告-天眼查
  • 电商大佬激战“海淘”市场
  • python 开发工具_5个超级好用的Python开发工具,新手必备
  • 小学一年级上册思品期末试卷
  • 2011届高三历史上册期末模块考试试卷3
  • 建筑工程论文 沥青混合料面层施工质量控制研究
  • 纪梵希口红哪个色号适合黄皮?禁忌之吻12号
  • 冀教版四年级英语上册课件Unit 3 Lesson 14 Near and Far-3
  • 【最新版】电子商务网站SEO优化本科毕业设计
  • 人教版七年级上册道德与法治 第2课时 活出生命的精彩 教学课件
  • 苏教版三年级语文下册课外阅读专项练*题
  • 痛风病饮食指导及预防
  • “9.22”世界无车日活动总结
  • 初中作文创新——怎样拟小标题ppt课件(自制)
  • 工商管理专业介绍.ppt-文档资料
  • 坚强勇敢的名言句子
  • 属马的男人性格特点是怎样的
  • 【推荐下载】《淮南子·泰族训》阅读答案附译文-实用word文档 (2页)
  • 新版劳务派遣管理制度2020年新
  • 八年级道德与法治上册第一单元走进社会生活第一课丰富的社会生活第二框《在社会中成长》课件新人教版 (2)
  • 健康素养66条ppt
  • 两个地址
  • 白钢项目可行性研究报告
  • 在迅捷OCR文字识别软件中怎么将图片局部文字识别出来
  • 英语毕业论文浅谈初中英语教学中课堂用语的艺术
  • 《侠客风云传》二周目继承哪些内容
  • (参考模板)白茶项目立项报告
  • (目录)2018-2023年中国人棉纱行业市场发展预测及投资咨询报告
  • 【标准合同模板】全国最新人寿保险合同条款1【精品】
  • 一年级下册五六单元看拼音写汉字精选
  • 职业院校“现代学徒制”与“工作室制”人才培养模式之比较研究
  • 最新北师大版一年级语文下册第三单元提升练*题及答案
  • 小学生法制宣传倡议口号
  • 电脑版