Java的字符串为什么挪到了堆里?

我们知道的2个事实:

1 字符串的值是放在常量池里的

2 hotspot vm在jdk1.7之前,常量池是放在方法区(堆外的永久代)

 

java在jdk1.7开始, 字符串挪到了堆里, 这么做的目的是什么?

1 堆内回收效率高: 堆外的方法区的内存(Class)回收效率(可回收比例和执行时间成本)不如堆内

2 永久代/元数据区一般不会设置一个很大的值.

永久代/元数据区由于(字符串/动态加载jar/cglib生成的类(rpc orm)/lambda/反应式编程),容易导致OOM

一般堆内存会被设置为一个比较大的值,在常量池(含字符串)占用很大的情况下,不容易导致OOM

3 String.intern()方法的效率提升, 节省了复制堆中的字符串到常量池中的成本.

如果调用 intern 方法,会去查看字符串常量池中是否有等于该对象的字符串的引用,如果没有,在 JDK1.6 版本中会复制堆中的字符串到常量池中,并返回该字符串引用,堆内存中原有的字符串由于没有引用指向它,将会通过垃圾回收器回收。

在 JDK1.7 版本以后,由于常量池已经合并到了堆中,所以不会再复制具体字符串了

 

总结是两个原因:

  1. 避免OOM
  2. 提高执行效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值