测试Perm区溢出引起的OOM以及原因分析

本文介绍了一个导致 Java 永久代内存溢出的示例程序及其原因分析,包括 String 实习化导致的内存占用及类加载器创建的内部类描述符累积等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 String.intern(String)这个方法创建的String是在永久内存堆上。当创建许多可reachable的这种String时,可能会导致永久内存区的溢出。

2 通过类加载器创建内部的创建的内部类描述符也是在永久内存堆上。如果你的类动态的加载了许多的类,并且这些对象不能执行gc,也有可能会导致永久内存区的溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值