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移除了永久代还是在之前,字符串常量池不是一直都在堆内存里面吗?为什么要区分着说?而且它现在是存放在堆的具体哪个部位?
#Java#
全部评论
永久代又叫方法区,方法区跟堆不是同一块内存啊,也不存在包含关系
点赞 回复 分享
发布于 2019-09-12 16:20

相关推荐

卖挂面鸡蛋不锈钢盆:top2 就发面试的年代已经一去不复发了
投递快手等公司10个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务