Java堆中的constantPoolClass?

DGe*_*try 9 java memory

我继承了一个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.所以也许我对这些对象的作用不正确.谁能解释一下?

Tom*_*ine 4

是的,看起来你正在泄漏类加载器。如果您实际上没有在自己的代码中创建类加载器(通常通过 URLClassLoader.newInstance 或 XSLT),那么它可能与重新加载小程序有关(尽管您通常会返回相同的类加载器)。泄漏的可能原因是ThreadLocal、JDBC 驱动程序和java.beans。