静态常量池&运行常量池&字符串常量池的区别
静态常量池&运行时常量池&字符串常量池区别_哔哩哔哩_bilibili
本文以案例拆分
硬盘中的class常量池,被加载到内存后分为 运行时常量池 和 字符串常量池。
静态常量池
+ 定义与位置: 静态常量池也称为类文件常量池,是存在于**.class** 文件(Java字节码文件)内部的一个数据结构。它是编译器在编译源代码时生成的,与具体的类或接口关联,存储了该类或接口在编译期间能确定的各类常量信息。 + 每个class文件有对应的一个 Class常量池 ,里面包含符号引用和字面量。运行时常量池
定义与位置: 运行时常量池是JVM在运行时为每个已加载的类或接口动态创建的一个内存区域,位于方法区(Method Area)内。它是对.class文件中静态常量池内容的 runtime 实现。- 当class被加载后,class常量池中的内容会被加载到方法区的运行时常量池中,但是并不包含 字面量中字符型 内容。
字符串常量池
定义与位置: 字符串常量池是运行时常量池的一个子集,专门用于存储字符串字面量。在JDK 6及之前,字符串常量池位于永久代(PermGen)中;从JDK 7开始,字符串常量池被移至Java堆(Heap)。- 当class被加载后,class常量池字面量中的字符型内容会被加载到堆中的 字符串常量池 中。
分析Demo
1 | public class StringDemo1 { |
查看Class常量池
1.查看字节码
- 类常量池是每个类都有的,其存在于class文件中的;
查看运行时常量池
使用HSDB来查看运行时常量池
使用jps查看当前java程序的进程号
使用HSDB查看StringDemo1的进程信息
总结:
+ 每个Class文件都有一个Class常量池;其中储存的有符号引用,这里的符号引用显示的是类型,没有地址;其中还有字面量,字面量有数值型和字符串型; + 当一个类加载后,class常量池中的内容会被加载到方法区的运行时常量池中,但是并不包含 字面量中字符型 内容。当class被加载后,class常量池字面量中的字符型内容会被加载到堆中的 字符串常量池 中。 +本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 山麋一笑!
评论