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