jvm 什么是常量池,常量池定义 class常量池

这篇具有很好参考价值的文章主要介绍了jvm 什么是常量池,常量池定义 class常量池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先需要理解下Java的class文件,以及class文件结构:

1.Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文 件之中,中间没有任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割 成若干个8个字节进行存储

    注: 任何一个Class文件都对应着唯一的一个类或接口的定义信息,但是反过来说,类或 接口并不一定都得定义在文件里(譬如类或接口也可以动态生成,直接送入类加载器中)

2.Class文件格式采用类c语言结构体的伪结构来存储数据

            结构:

                      a. 无符号数

                      b.

      a.无符号数属于基本数据类型,u1:代表1个字节无符号数,有四个参数 u1, u2, u4, u8。 它们们用来描述数组,索引引用,数量值或字符串

      b. :无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名 都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上也可以视 作是一张表,这张表由下图所示的数据项按严格顺序排列构成

jvm 什么是常量池,常量池定义 class常量池,jvm

 3. 图中的constant_poll 即常量池,是class中的表结构(类型cp_info)

 4. 常量池可以比喻为class文件存放的资源仓库,它是class结构中与其他项目引用最多的数据,通常也是占用class文件空间最大的数据项目之一

 5. 常量池入口为u2类型数据,为常量池容量计数值,常量池中有21项常量。索引范围1~21

 6. 常量池存放类型

     a. 字面量(Literal)

     b. 符号引用(Symbolic References)

   字面量: 文本字符串,声明为final的常量值等

   符号引用:

                    ·被模块导出或者开放的包(Package)

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

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

                    ·方法的名称和描述符

                    ·方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)

                    ·动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)

7. class文件不会保存方法,或字段的值而是通过常量池进行转换使用。虚拟机进行类加载时,从常量池获取到字面量(一些常量值),符号引用(指针引用数据),在类创建或运行时解析,从常量池拿到这些数据,到具体的内存地址之中。(我认为与将代码中的魔法值,类似1,2,字符串等抽出来,单独放到一个类中类似,常量池就是做这个的)

8.常量池每一项常量都是一个表,截止jdk13,一共有17种不同类型常量:

jvm 什么是常量池,常量池定义 class常量池,jvm

9. 总结来说,常量池就是存储类中(编译后的class文件):字符串的值,final常量,方法引用,方法描述,方法类型等的表结构文章来源地址https://www.toymoban.com/news/detail-670758.html

到了这里,关于jvm 什么是常量池,常量池定义 class常量池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JVM运行时数据区——字符串常量池位置的调整

    JVM运行时数据区——字符串常量池位置的调整

            在JDK6及之前,使用永久代来实现方法区,字符串常量池(StringTable)是在 永久代(方法区)中 的,但是方法区的回收效率不高,在Full GC时才会回收。           在JDK7中,将字符串常量池 转移到了堆中 ,分配在年轻代和老年代中。         在JDK8中,为了 融合

    2024年02月16日
    浏览(7)
  • Thinkphp定义位置常量

    ThinkPHP 是一个流行的 PHP 开发框架,它提供了丰富的功能和便捷的开发方式。在 ThinkPHP 中,我们可以使用常量来定义一些通用的配置信息或路径,以便于代码的维护和管理。在本文中,我们将探讨 ThinkPHP 中定义位置常量的作用和用法。 一、什么是位置常量? 位置常量是在

    2024年02月12日
    浏览(8)
  • 【JVM学习】Class文件解析

    最近为了加深对于JAVA的理解,在复习JVM,这里面的内容大部分都是比较确定的、文档性质的内容,目前并没有特别的总结。但是看到类文件结构,手痒,想写了个解析文件的解析器,那就简单记录下吧。 详细内容不记了,太多了,有兴趣的同学看虚拟机相关书籍了解,这里

    2023年04月13日
    浏览(8)
  • 什么是常量?如何区分常量和变量?

            什么是常量,什么是变量?怎样区分⼆者? 1. 常量与变量         (1)常量即其值在程序运⾏的过程中是不可以改变的,如123,-4567 为数值常量;         (2)变量是在程序运⾏期间其值是可以进⾏变化的量                  如 int a; char b:是整型变

    2024年02月02日
    浏览(10)
  • TypeScript枚举:方便的常量定义方式

    在 TypeScript 中,枚举是一个非常重要的特性,它提供了一种方便的常量定义方式。在本文中,我们将详细探讨 TypeScript 枚举的用法和优势。 枚举是指 一组命名的常量 ,这些常量称为 枚举成员 。枚举可以在 TypeScript 中以类似于 C# 和 Java 的方式来定义,它们在 JavaScript 中被编

    2024年02月11日
    浏览(7)
  • 从执行class文件开始认识JVM

    编写好的java文件经过javac编译成class文件,使用java命令执行对应得我class文件,这时候jvm开始运行 首先,jvm需要将class文件装载进入内存空间(类加载机制) 在内存中分配空间(认识JVM运行时数据区) 类加载机制 类加载分为几个步骤 装载 class文件装载进JVM首先要进行的就是

    2024年02月10日
    浏览(13)
  • 一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

    一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

    JVM : Java Virtual Machine ,也就是 Java 虚拟机 所谓虚拟机是指:通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即:虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中,且它的硬件系统功能是通过软件模拟出来的。 JVM 通

    2024年01月23日
    浏览(22)
  • 探索 Go 语言中 iota 的神奇力量,优雅定义常量!

    大家好!在今天的文章中,我将为大家介绍一下关于 golang 中的 iota 的使用技巧和注意事项。作为一种枚举常量生成器,iota 在 golang 中被广泛使用,可以简化代码和提高可读性。下面就让我们来了解一些关键的使用技巧和注意事项吧! 在 golang 中,iota 是一个预定义标识符,

    2024年02月13日
    浏览(7)
  • JAVA-JVM 之Class字节码文件的组成 【上篇】

    JAVA-JVM 之Class字节码文件的组成 【上篇】

    主页传送门:📀 传送   java的特点是跨平台性,而跨平台的运行标准是Class字节码文件,Class字节码是提供平台无关性的基础模型,使我们无须考虑如何兼容异构系统,只须被JVM识别即可。   字节码是Java虚拟机中的核心,是Java源代码的一种中间表示形式。简单来说,字

    2024年02月06日
    浏览(8)
  • 二、GoLang输出HelloWorld、基本数据类型、变量常量定义、基本类型转换

    go语言中,想要输出内容到控制台,package必须是main,包括方法名也必须是main, go语言输出的语法是 fmt 库。 Go语言的基本类型有: boolean:布尔类型 true / false string :字符串类型 数值型: int8:有符号8位整型(-128到127)长度 int16:有符号16位整型(-32768到32767)长度 int32:有

    2024年02月09日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包