java的大佬们,小弟请教一个问题!!!
题引:
String str1 = “abc” 编译为字节码后,实际上相当于:String str1 = “abc”.intern()
对于JDK 1.6,intern()方法是这样的:如果“abc”是首次遇到,则字符串“abc”本身会被复制到字符串常量池中,且以后如果再遇到“abc”,直接返回常量池的引用。注意,JDK 1.6的常量池存在于JVM的永久代中,而对于Hotspot虚拟机的实现,永久代事实上对应java虚拟机规范中的方法区!
对于JDK 1.7,intern()方法不会对字符串实例进行复制,而只是在字符串常量池中记录首次出现的实例引用。当然,最关键的是,JDK 1.7中的字符串常量池是在堆中的!
具体请参考 “深入理解JAVA虚拟机”一书中 第 42页 和 第57页 的讨论
问题:
大佬们,我看书和一些博客上都说方法区是jvm的一个逻辑概念,其实际使用的存储空间是永久代的存储空间(jdk1.7以前),我的疑惑是永久代不也是堆的一个分区吗,那无论是在1.8移除了永久代还是在之前,字符串常量池不是一直都在堆内存里面吗?为什么要区分着说?而且它现在是存放在堆的具体哪个部位?