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

简介: JVM - Class常量池 || 运行时常量池

20200713001934882.png


Pre

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

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


class常量池

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

Class文件中主要由两大部分

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

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


20200713002527103.png


基本含义


20200713002604898.png


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

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


20200713002930646.png

20200713002947382.png


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


字面量

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

比如

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


符号引用


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

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

刚刚上面的代码

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

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

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


运行时常量池


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


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

相关文章
|
4月前
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
73 0
|
4月前
|
存储 缓存 Java
Java虚拟机运行时数据区精华总结
Java虚拟机运行时数据区精华总结
70 0
|
1月前
|
存储 Java 编译器
【JVM】运行时数据区域
【JVM】运行时数据区域
20 0
|
3月前
|
存储 Java C++
JVM 运行时数据区
JVM 运行时数据区
|
3月前
|
算法 Java
jvm性能调优实战 - 41JVM运行原理和GC原理Review
jvm性能调优实战 - 41JVM运行原理和GC原理Review
36 0
|
3月前
|
存储 算法 Java
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
36 0
|
4月前
|
存储 缓存 前端开发
JVM(二):Class加载机制
JVM(二):Class加载机制
|
4月前
|
存储 Java 编译器
JVM(一):Class文件格式
JVM(一):Class文件格式
|
4月前
|
存储 缓存 Java
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
34 0
|
4月前
|
存储 缓存 Java
认真学,JVM内存模型(运行时数据区)
认真学,JVM内存模型(运行时数据区)
74 0