首页 新闻 会员 周边 捐助

jdk1.7之后把字符串常量池 放到 堆中的目的是什么?

0
悬赏园豆:30 [已解决问题] 解决于 2019-01-07 14:47

我一开始自己认为,如果是在堆中,那么寻址起来方便,毕竟不用像jdk1.6的时候 堆 和 方法区 之间来回找。
但是我也有疑惑:
jdk1.6之前,字符串常量池中放的是 字符串实例;
但jdk1.7后 因为字符串常量池放到堆中,String的intern()方法也发生了变化,字符串常量池 放的是 首次出现的实例引用。
举个例子:String str1 = "1";// 在堆中有一个"1"实例,然后字符串常量池中有 "1"的引用,也就是str1的地址。
String str2 = "1";// 那么 str2 会被 赋的str1的引用,所以str2 == str1 ;但这样不会有效率问题吗?
因为我要到 字符串常量池中 用 "1" 去找某个引用pt,然后 要用这个引用pt去找对应的 字符串aimStr,比较"1"和aimStr 来确定是否存在"1"的引用了,这样不会影响效率吗?

刚学虚拟机,想了很久,希望有人能帮我解决一下疑惑...

Jinke2017的主页 Jinke2017 | 菜鸟二级 | 园豆:237
提问于:2018-09-11 22:51
< >
分享
最佳答案
0

深入理解jvm的第二章2.2节有说到,方法区会在以后逐步移除,采用native memory来实现方法区的规划,好像是因为方法区的回收比较困难,也因此导致过很多严重的bug。
至于你说的效率问题,我也就不太清楚了。感觉你的例子中,str1和str2本身就是对象的地址嘛,它们之间的比较不会影响效率吧。
至于对于寻址,hotspot好像是先通过对象的reference找到堆中的对象实例,然后对象实例指针指向方法区中的对象类型数据。至于1.7中当把常量池移除方法区后,有没有什么新的变化,我现在也不是很清楚,但是觉得应该至少不会更复杂吧。
ps:纯属个人观点,望指正。

收获园豆:30
让我发会呆 | 老鸟四级 |园豆:2929 | 2018-09-12 09:25

请问 native memory 是指本机的内存吗,也就是 直接内存?

Jinke2017 | 园豆:237 (菜鸟二级) | 2018-09-12 09:54

@Jinke2017: native memory好像是放一些native方法,JIT编译时一些东西等等,好像1.8已经把元数据直接放在里面了。这有篇博客:https://www.cnblogs.com/xrq730/p/8688203.html,说Metaspace的一些东西。
至于你说的直接内存是指direct memory吗?好像和native memory不是一个概念,具体你可以网上找一找吧,我也不太清楚了 = =!

让我发会呆 | 园豆:2929 (老鸟四级) | 2018-09-12 10:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册