Java有三种常量池,即字符串常量池、class文件常量池、运行时常量池。
-
Class常量池:保存类编译生成的字面量和符号引用。Class文件除了类字段,方法,接口描述等,还有Class常量池
-
运行时常量池: 是JVM的概念,除了存放编译生成字面量和符号引用。还允许运行时产生常量,比如
String.intern
方法- JDK 1.6 中运行时常量池在方法区,而方法区放在内存中的永生代。
- JDK 1.7中常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行常量池。
- JDK1.8 将方法区直接放在一个与堆不相连的本地内存区域,这个区域被叫做元空间。
-
字符串常量池。
String
类管理的常量池,处于堆内存中。
1. 字符串常量池——特殊的常量池,存在于方法区(method are), 不是堆
字符串常量池在每个VM中只有一份,他在内存中的位置如图,红色箭头所指向的区域 Interned Strings, 存在于方法区, 不是堆