苏州Java培训
达内苏州java培训中心

0512-67873100

热门课程

深入理解Java String#intern()内存模型

  • 时间:2016-06-30
  • 发布:苏州java培训
  • 来源:Java教程

苏州java培训学生学习Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回。

字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, 从Java7u40开始,该默认值增大到60013。在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间。下面,我们通过测试程序来窥探字符串常量池在Java6,Java7两个不同版本底下的内存分配情况。

测试程序

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函数启动程序。

结论

由于Perm区大小是有限的,通常只有几十MB,所以不推荐在Java6下广泛使用String.intern(),这篇文章string-intern-in-java-6-7-8的性能测试表明,在Java6底下大量使用intern()会导致应用性能的显著下降,还有可能产生OOM错误。但从Java7开始,字符串常量池被移到了Heap空间,Heap空间的大小只受制于机器的真实内存大小,因此,在Java7下使用String.intern()能更有效地减少重复String对象对内存的占用。

上一篇:Java中ArrayList和LinkedList区别
下一篇:Java中注释的使用是有原则的

苏州java培训:Java的特点

苏州java培训:JAVA概述

苏州达内java培训怎么样?达内java培训有什么优势?

苏州java培训哪家好 全方位对比java培训机构

选择城市和中心
贵州省

广西省

海南省