我继承了一个Java applet(一个实际的<APPLET>),它在运行大约4天后抛出一个OutOfMemory异常.applet的本质是人们真的会长时间保持开放状态.
运行近两天后,jmap -histo将顶级堆消费者显示为:
num #instances #bytes class name
--- ---------- ------ ----------
1: 14277 7321880 <constantPoolKlass>
2: 59626 5699968 <constMethodKlass>
3: 14047 5479424 <constantPoolCacheKlass>
4: 14277 5229744 <instanceKlassKlass>
5: 59626 4778944 <methodKlass>
6: 71026 3147624 <symbolKlass>
麻烦的是,我不明白这些东西是什么.至少有两件事情发生了:constantPoolKlass + constantPoolCacheKlass + instanceKlassKlass看起来是相关的,constMethodKlass + methodKlass也是如此.从名称来看,它们似乎与类加载器相关.
如果我不得不猜测我会说applet创建了大约14,277个对象,其中每个对象有大约4种方法,总共大约59626个方法.然而,jmap输出并没有显示任何具有如此大量实例的类,也没有看起来像其他类对象的总和加起来为14277.所以也许我对这些对象的作用不正确.谁能解释一下?
是的,看起来你正在泄漏类加载器。如果您实际上没有在自己的代码中创建类加载器(通常通过 URLClassLoader.newInstance 或 XSLT),那么它可能与重新加载小程序有关(尽管您通常会返回相同的类加载器)。泄漏的可能原因是ThreadLocal、JDBC 驱动程序和java.beans。
| 归档时间: |
|
| 查看次数: |
3487 次 |
| 最近记录: |