我继承了一个 Java 小程序(一个实际的
运行近两天后, 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 也是如此。从名称来看,它们似乎与类加载器有关。
如果我不得不猜测的话,我会说该小程序创建了大约 14,277 个对象,其中每个对象大约有 4 个方法,总共大约有 59626 个方法。然而,jmap 输出没有显示任何具有如此大量实例的类,也不像其他类对象的总和总计为 14277。所以也许我对这些对象的作用是不正确的。有人可以解释一下吗?
是的,看起来你正在泄漏类加载器。如果您实际上没有在自己的代码中创建类加载器(通常通过 URLClassLoader.newInstance 或 XSLT),那么它可能与重新加载小程序有关(尽管您通常会返回相同的类加载器)。泄漏的可能原因是ThreadLocal、JDBC 驱动程序和java.beans。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)