В моем приложении у меня есть ошибка PermGen нехватки памяти, и я хочу посмотреть, что к ней привело.
Я подключился к своему приложению через VisualVM.
Я хочу посмотреть, что именно потребляет столько памяти PermGen в моем приложении, но я не могу взять специальную «кучу PermGen» в VisualVM. Я могу взять только стандартный HeapDump.
Можно ли узнать, что именно потребляет всю мою память PermGen с помощью VIsualVM или какого-либо другого инструмента?
ОБНОВЛЕНИЕ Этот вопрос был помечен как "повторяющийся", но на самом деле я не вижу ответа на свой вопрос в упомянутой теме. Проблема в том, что я не вижу способа перечислить, что именно потребляет память в моем пространстве permgen.
В настоящее время из этой темы я знаю следующие подсказки:
Запустите jmap -permstat и посмотрите, сколько PermGen используется стажерскими строками. Хорошая идея, работает: теперь я знаю, что String Pool не проблема в моем случае.
Запустите jmap -permstat и посмотрите, как память потребляется загрузчиками классов. Это работает, но в AppClassLoader сотни классов, мне это мало помогает.
Запустите утилиту PrintStringTable.java, чтобы узнать, какие строки занимают память. Я не могу запустить его на своем ПК с Windows 7, потому что я получаю
Присоединение к процессу с идентификатором XXXX, подождите... Ошибка присоединения к процессу: истекло время ожидания при попытке подключения к серверу отладки (запустите SwDbgSrv.exe).
Как бы то ни было, это не мой случай.
- Отследите загрузку классов во время выполнения, указав свойства JVM. Это работает, но не помогает мне понять, что отнимает память, там загружены тысячи классов.
Поэтому я не вижу здесь ответа на свой вопрос. Я знаю, что PermGen потребляется не только самими классами, но и их статическими членами. Как я могу отслеживать, какие статические члены каких классов потребляют память?
Пожалуйста, дайте мне знать, если я пропустил этот ответ.