1、深入理解JavaString#intern()内存模型字符串常量池是一个固定大小的HashMap,桶的数量默认是1009,从Java7u40开始,该默认值增大到60013。在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间。下面,我们通过测试程序来窥探字符串常量池在Java6,Java7两个不同版本底下的内存分配情况。测试程序public class StringPoolTest { public void testStringPoolWithLongString(){ long i=0;
2、 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 stri
3、ngPoolTest = new StringPoolTest(); stringPoolTest.testStringPoolWithLongString(); } } 测试程序很简单,一个死循环,循环里面通过递增变量i制造唯一的字符串,然后用main函数启动程序。Java6我们使用版本Jdk1.6.0_29来跑该程序,打开JavaVisualVM监控,可以看到,Perm区不断发生GC,由此的出结论,虽然字符串常量池放在Perm空间,但当Perm空间接近满的时候,JVM会将字符串常量池中的无用字符串回收掉。Java7下面,我们切换到Jdk1.7.0_6