JVM - Class常量池 || 运行时常量池

举报
小工匠 发表于 2021/09/10 23:15:20 2021/09/10
【摘要】 文章目录 Preclass常量池字面量符号引用运行时常量池 Pre JVM - 深入剖析字符串常量池 JVM - 基本类型的包装类和对象池 class常量池 Class常...

在这里插入图片描述

Pre

JVM - 深入剖析字符串常量池

JVM - 基本类型的包装类和对象池


class常量池

Class常量池我们可以理解为是Class文件中的资源仓库。

Class文件中主要由两大部分

  • 类的版本、字段、方法、接口等描述信息外,
  • 常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)

我们来看下我们天天打交道的class文件十六进制的样子 大致如下

在这里插入图片描述

基本含义

在这里插入图片描述

通常都是 javap 来生成可读的字节码文件来查看。

或者在idea中装个 jclasslib插件 查看

在这里插入图片描述

在这里插入图片描述

这里面主要是两个东西; 字面量和符号引用


字面量

么错 就是你想的那个意思: 由字母、数字等构成的字符串或者数值常量 。

比如

int a = 1;
int b = 2;
String c = "artisan";
String d = "art123";

  
 
  • 1
  • 2
  • 3
  • 4

符号引用

符号引用是编译原理中的概念,是相对于直接引用来说的。主要包括了以下三类常量:

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

刚刚上面的代码

a、b 、c、d就是字段名称,就是一种符号引用,

类的全限定名也是符号引用,

类中的方法名称,()是一种UTF8格式的描述符,这些都是符号引用。


运行时常量池

class常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,也就是我们说的动态链接了。

举个例子哈,methodA()这个符号引用在运行时就会被转变为methodA()方法具体代码在内存中的地址,主要通过对象头里的类型指针去转换直接引用。


文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/107308535

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。