测试Perm区溢出引起的OOM以及原因分析
2014-08-17 10:50
211 查看
Jdk版本:1.6.0_38
运行参数:-XX:PermSize=4M -XX:MaxPermSize=4M -verbose -verbose:gc-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
程序代码:
public static void main(String[] args) {
Random rnd = new Random();
List<String> interned = newArrayList<String>();
for (;;) {
int length = rnd.nextInt(100);
StringBuilder builder = newStringBuilder();
String chars ="abcdefghijklmnopqrstuvwxyz";
for ( int i = 0; i < length; i++) {
builder.append(chars.charAt(rnd.nextInt(chars.length())));
}
interned.add(builder.toString().intern());
}
}
运行结果:
导致永久内存区溢出,有两种可能性:
1
运行参数:-XX:PermSize=4M -XX:MaxPermSize=4M -verbose -verbose:gc-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
程序代码:
public static void main(String[] args) {
Random rnd = new Random();
List<String> interned = newArrayList<String>();
for (;;) {
int length = rnd.nextInt(100);
StringBuilder builder = newStringBuilder();
String chars ="abcdefghijklmnopqrstuvwxyz";
for ( int i = 0; i < length; i++) {
builder.append(chars.charAt(rnd.nextInt(chars.length())));
}
interned.add(builder.toString().intern());
}
}
运行结果:
导致永久内存区溢出,有两种可能性:
1
String.intern(String)
这个方法创建的String是在永久内存堆上。当创建许多可reachable的这种String时,可能会导致永久内存区的溢出。
2
通过类加载器创建内部的创建的内部类描述符也是在永久内存堆上。如果你的类动态的加载了许多的类,并且这些对象不能执行gc,也有可能会导致永久内存区的溢出。
相关文章推荐
- bitmap溢出oom问题的原因以及解决
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- tomcat内存溢出原因分析与解决以及java内存溢出、栈溢出的原因与排查方法
- Java虚拟机内存溢出原因分析以及解决方案
- 对Oracle中索引叶块分裂而引起延迟情况的测试和分析
- 常见邮件发送失败原因分析以及解决方法
- 白苹果问题解决办法以及原因简单分析
- CCNP改版的背景以及原因分析
- 分析以及测试PCTFREE和PCTUSED参数是如何协调工作的
- 非并发原因引起的乐观锁异常故障分析
- 引起FileNotFoundException原因通用分析过程
- IIS应用程序池由服务器引起常见错误号的原因分析及解决方法
- CPU使用率高的原因和解决方法以及案例分析
- 系统启动出现0x000000F4错误是由什么原因引起的及分析?
- mysql 3306 端口 close_wait引起的原因分析
- 弹窗代码以及弹不出来的原因分析
- 引起FileNotFoundException原因通用分析过程
- Session丢失可能的原因分析以及相应的解决办法
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式