【JAVA基础】常量池、字符串字面量、JAVA编译

2019-02-19  本文已影响0人  嘻洋洋

1.常量池的概念

分为两大类:静态常量池和运行时常量池。

注意: 运行时常量池中的常量,基本来源于各个class文件中的常量池。程序运行时,除非手动向常量池中添加常量(比如调用intern方法),否则jvm不会自动添加常量到常量池。

2.关于方法区的理解

补充两个概念:
(1)方法区——线程共享的,主要存储类信息、常量池、静态变量、JIT编译后的代码等数据。方法区理论上来说是堆的逻辑组成部分;
(2)运行时常量池——是方法区的一部分,用于存放编译期生成的各种字面量和符号引用;

3.字符串常量池中存放的时引用还是对象的问题

4.Java编译过程(字符串字面量的处理)

(1)当一个.java文件被编译成.class文件时,和所有其他常量一样,每个字符串字面量都通过一种特殊的方式被记录下来。
(2)当一个.class文件被加载时(注意加载发生在初始化之前),JVM在.class文件中寻找字符串字面量。
(3)当找到一个时,JVM会检查是否有相等的字符串在常量池(存放的地址引用)中存放了堆中引用
(4)如果找不到,就会在堆中创建一个对象,然后将它的引用存放在池中的一个常量表中。
(5)一旦一个字符串对象的引用在常量池中被创建,这个字符串在程序中的所有字面量引用都会被常量池中已经存在的那个引用代替。

上一篇下一篇

猜你喜欢

热点阅读