gpt4 book ai didi

java - Java堆中的constantPoolClass?

转载 作者:IT王子 更新时间:2023-10-28 23:34:31 25 4
gpt4 key购买 nike

我继承了一个 Java 小程序(一个实际的 ),它在运行大约 4 天后引发 OutOfMemory 异常。小程序的本质是人们真的会长时间打开它。

运行近两天后,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。

关于java - Java堆中的constantPoolClass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/340997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com