五 5.4 — 方法区运行时常量池的理解
学习渠道:尚硅谷
方法区运行时常量池的理解
A.JVM运行时内存结构
B.常量池与运行时常量池的理解
要了解运行时常量池,首先我们要了解的是常量池,,因为常量池在类加载的时候加载到方法区中就变成了运行时常量池
C.为什么需要常量池这种数据结构
- 可让代码"减负"
- 常量池中使用到的都是符号引用
- 真正要去运行的话,就要真正去找那些真正的类了(找到了还要记录那些地址,方便下次找),,比如String System Object 。。。
D. 使用jclasslib演示的任意demo
我们可以发现,其他各种方法的常量池的调用逻辑是十分复杂的(当然,运行时需要将这些符号引用转成直接引用),比如:
- String Ljava/io/PrintStream 里面的L是指引用类型
- System,out.print(“a”+“b”) 此处print()方法会先构造一个StringBuilder的对象,拼接之后在返回
- 做一个比喻:常量池比喻成原材料场地,然后我们的程序就是从其中挑选出内容来合成“产品”
F.常量池中的内容
G.常量池小结
常量池我们可以看做是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型,字面量等类型。
H.接下来介绍运行时常量池
运行时常量池,相对于Class文件常量池的另一重要特征:具备动态性
String.Intern() 比如这个方法就放到了运行时常量池中