constantPoolClass в куче Java? - PullRequest
       12

constantPoolClass в куче Java?

9 голосов
/ 04 декабря 2008

Я унаследовал Java-апплет (фактический ), который выдает исключение OutOfMemory после примерно 4 дней выполнения. Природа апплета такова, что люди действительно оставят его открытым на длительное время.

После почти двух дней работы 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. Так что, возможно, я ошибаюсь относительно того, что делают эти объекты. Может кто-нибудь объяснить?

Ответы [ 2 ]

4 голосов
/ 04 декабря 2008

Да, похоже, что вы пропускаете загрузчики классов. Если вы на самом деле не создаете загрузчики классов в своем собственном коде (обычно через URLClassLoader.newInstance или XSLT), то это может быть связано с перезагрузкой апплета (хотя обычно вы возвращаете тот же загрузчик классов). Возможные причины утечек: ThreadLocal, драйверы JDBC и java.beans.

2 голосов
/ 05 декабря 2008

Spot on - очевидно, проблема ClassLoader. Очень странно видеть это в апплете; обычно это проблема только с серверами приложений или IDE.

2 способа отладки: либо получите реальный профилировщик кучи, который может показать вам, на что ссылаются ваши данные класса сбежавших, либо исправьте классы API, как описано здесь: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html?page=2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...