String的intern方法的副作用
2011-12-27 11:49 康杜 阅读(402) 评论(1) 编辑 收藏 举报以下的测试环境是
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的内存溢出。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步