Jvm常量池分为:
- Class常量池(静态常量池)
- 运行时常量池
- 字符串常量池(全局常量池)
- 包装类型缓存池
当Java源文件被编译后,就会生成Class字节码文件。
Class常量池就存在于Class文件中(Class文件的Constant Pool中)。
Class文件常量池主要存放两大常量:字面量和符号引用。
-
字面量: 字面量分为文本字符串(如: "abc",1等)和用final修饰的成员变量(实例变量和静态变量)
-
符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。
运行时常量池是在类加载阶段,将class二进制数据加载到内存, 并将数据保存到方法区,其中class文件中的常量池将保存到 运行时常量池(数据都在方法区,常量池肯定也在方法区)。 也就是说一个Class文件常量池对应一个运行时常量池。
字符串常量池在jdk7之前都是存于永久代(永久代)之中,jdk7以后存于 堆区之中。
包装类缓存池并不是所有的包装类都有,并且缓存池缓存的是一定范围内的数据。 拥有包装类型缓存池的类有:Integer,Byte,Character,Long,Short, 而Float,Double,Boolean都不具有缓存池。
包装类的缓存池缓存的范围基本都为: -128 - 127之间, Character的缓存范围为 0 - 127。