以下的测试环境是
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
import java.util.Random;
public class StringInternPermGenDemo{
public static void main(String[] args) throws Exception{
Random random = new Random();
while(true){
String temp = "tempoary test for PermGen Out of Memory error" + random.nextInt();
temp.intern();
Thread.sleep(1000);
}
}
编译
javac StringInternPermGenDemo.java
运行
java –XX:PermSize=2M –XX:MaxPermSize=2M StringInternPermGenDemo
运行一段时间后出现
通过VisualVM查看PermGen的增长情况
结论
调用String的intern方法后,JVM会把该String放到PermGen内存区域中(也就是动态地放到常量池中--我忘记这句话的出处了,知道的告诉我一下),而PermGen内存区域是用于存放方法的永久区,所以不会被垃圾回收,最终导致PermGen的内存溢出。