I,缓存String在JVM内部使用HashTable进行缓存,不能动态扩展。二。String#intern()方法的创建和回收的作用是:1、如果该字符串不在Pool中,则向Pool中添加一条记录,然后返回Pool中的引用。2.如果已经在Pool中,直接返回Pool中的引用。StringPool中的String对象只要GCRoots不可达,就可以回收。如果Pool中的对象太多,YGC可能会变长,因为YGC时需要扫描StringPool。三、JVM中的StringPool在哪里1.在Java6中,StringPool位于PermGenSpace中,PermGen是一个固定大小的区域,所以在Java6中使用String.intern()时一定要小心,否则它很容易导致OutOfMemoryError。2.在Java7中,StringPool被移到了堆中。调整工作需要调整堆大小。3.在Java8中,StringPool仍然在HeapSpace中。四、容量在Java6中,HashTable默认的桶数是1009,可以通过(-XX:StringTableSize=N)配置。从Java7和Java8开始,默认值为60013。为什么是1009而不是1000或1024?因为1009是质数,有利于实现更好的散列。60013同样的事情。五、JVM参数两个JVM参数可以设置StringTableSize:-XX:StringTableSize=N-XX:+PrintStringTableStatistics
