jdk1.6 StringTable 位置是在永久代中,1.7、 1.8 StringTable 位置是在堆中。
永久代回收效率比较低,只有FGC的时候才会被回收。因为StringTable存在大量的字符串变量和常量。应该经常被回收。
堆中的对象MGC的时候,会被回收。 增加的回收效率。
/**
* 演示 StringTable 位置
* 在jdk8下设置 -Xmx10m -XX:-UseGCOverheadLimit
* 在jdk6下设置 -XX:MaxPermSize=10m
*/
public class Demo1_6 {
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<String>();
int i = 0;
try {
for (int j = 0; j < 260000; j++) {
list.add(String.valueOf(j).intern());
i++;
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
System.out.println(i);
}
}
}
1.6出现PermGen space异常。说明占用的是永久代的内存。
JDK1.8出现GC overhead limit exceeded。