Java 虚拟机的运行时数据区按照大的可以分为线程独立使用的数据区,和所有线程共享的数据区。
常量池其实就是方法区的一部分(当然这是 jdk1.7之前的位置),其实现在(也就是 jdk1.7 以后)java 虚拟机团队把常量池移动到了堆中。这个区域也叫做 “ 永久代 ” (PermGen),但是当前的 jdk1.8 虚拟机团队直接把常量池这个永久代取消了,然后取而代之的叫做元空间(MateSpace)。好吧这里我们还是讨论常量池还存在的情况的吧。之后会专门写关于 jdk1.7 以及1.8 中的做的很大的更改。
其实在 jdk1.7 之前这个地方主要存放的就是 class 字节码中的常量池的内容以及在运行过程中动态生成的常量。尤其是使用的比较多的 String.intern() 方法。这个方法的主要作用就是当程序第一个遇到这个字符串的时候会把他放入常量池中。然后返回常量池中的引用。