JVM - Class常量池 || 运行时常量池
【摘要】
文章目录
Preclass常量池字面量符号引用运行时常量池
Pre
JVM - 深入剖析字符串常量池
JVM - 基本类型的包装类和对象池
class常量池
Class常...
Pre
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)