字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, 从Java7u40开始,该默认值增大到60013。在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间。下面,我们通过测试程序来窥探字符串常量池在Java6,Java7两个不同版本底下的内存分配情况。
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、宝安网络推广、小程序设计、宝安网络营销、宝安企业策划、宝安品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供宝安建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
测试程序
- public class StringPoolTest {
- public void testStringPoolWithLongString(){
- long i=0;
- while(true){
- String longString = "This is a very long string, very very long string to test the gc behavior of the string constant pool"+i;
- longString.intern();
- i++;
- }
- }
- public static void main(String[] args){
- StringPoolTest stringPoolTest = new StringPoolTest();
- stringPoolTest.testStringPoolWithLongString();
- }
- }
测试程序很简单,一个死循环,循环里面通过递增变量i制造唯一的字符串,然后用main函数启动程序。
Java 6
我们使用版本Jdk1.6.0_29来跑该程序,打开Java VisualVM监控,可以看到,Perm区不断发生GC,由此的出结论,虽然字符串常量池放在Perm空间,但当Perm空间接近满的时候,JVM会将字符串常量池中的无用字符串回收掉。
Java 7
下面,我们切换到Jdk1.7.0_67重跑该程序,可以看到Perm区内存分配曲线很平滑,没有出现内存分配的现象。
但在Heap空间,新的对象不断产生,然后不断触发GC
结论
由于Perm区大小是有限的,通常只有几十MB,所以不推荐在Java6下广泛使用String.intern(),这篇文章string-intern-in-java-6-7-8的性能测试表明,在Java6底下大量使用intern()会导致应用性能的显著下降,还有可能产生OOM错误。但从Java7开始,字符串常量池被移到了Heap空间,Heap空间的大小只受制于机器的真实内存大小,因此,在Java7下使用String.intern()能更有效地减少重复String对象对内存的占用。
当前标题:深入理解JavaString#intern()内存模型
分享URL:http://www.gawzjz.com/qtweb/news43/190043.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联