String的intern方法的副作用

以下的测试环境是

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

运行一段时间后出现

image

通过VisualVM查看PermGen的增长情况

image

结论

调用String的intern方法后,JVM会把该String放到PermGen内存区域中(也就是动态地放到常量池中--我忘记这句话的出处了,知道的告诉我一下),而PermGen内存区域是用于存放方法的永久区,所以不会被垃圾回收,最终导致PermGen的内存溢出。

原文地址:https://www.cnblogs.com/cando/p/2303283.html