Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема PermGen space 
:(
    Опции темы
fenix666
  Дата 1.10.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



Занимаюсь разработкой веб-сервисов, которые вертятся на IBM WebSphere.
В последнее время стала возникать ошибка java.lang.OutOfMemoryError: PermGen space, результате чего сфера перестает отвечать.
При этом ява запущена с опциями: -Xms256m -Xmx512m -XX:MaxPermSize=256m
Обычно память разрастается во время очередного деплоя сервиса, но также и во время работы понемногу съедается.

Есть ли способ получить содержимое этой памяти, чтобы увидеть какие классы загружены и занимают место?
Либо иной способ, побороть ее? 
PM MAIL   Вверх
Farmazon
Дата 1.10.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



1. при запуске жабы можно этот пермген увеличить (опция -XX:MaxPermSize при запуске)
2. При переразвёртывании бинов/вебсервисов/проч. тащить за собой меньше классов. Т.е. надо основные зависимости скинуть в папку lib, и не переразвёртывать их каждый раз.



--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Skynin
Дата 1.10.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 1
Всего: 10



Попробовать добавить еще:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled 
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
fenix666
Дата 4.10.2011, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



Цитата(Skynin @ 1.10.2011,  12:48)
Попробовать добавить еще:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

Пробовал, эти опции отсрочили эту проблему дня на 2-3, потом снова ошибка вылезла.
PM MAIL   Вверх
priam220
Дата 4.10.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 1
Всего: 8



Возможно твоему сервису просто не хватает места. Разростается куча и наезжает на область PermGen. Т.е. можно просто увеличить область кучи, хотя бы до гига (-Xms1024m -Xmx1024m), и посмотреть что произойдет. 
А возможно  у тебя где то происходит утечка памяти, и тогда нужно дебажить. С JDK поставляется спец утилита, которая может помочь тебе в этом: jconsole.exe.


Это сообщение отредактировал(а) priam220 - 4.10.2011, 10:00
PM MAIL   Вверх
LSD
Дата 4.10.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Цитата(fenix666 @  4.10.2011,  08:37 Найти цитируемый пост)
эти опции отсрочили эту проблему дня на 2-3, потом снова ошибка вылезла

PermGen space в основном используется для хранения скомпилированных классов. Что у тебя за приложение такое, что постоянно подгружает новые классы?

Добавлено через 24 секунды
Возможно стоит форкнуть часть приложения?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jk1
Дата 4.10.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

Обычно память разрастается во время очередного деплоя сервиса, но также и во время работы понемногу съедается.

Perm gen memory leak часто возникает при редеплое "вгорячую". Разумеется, в production такого происходить не будет, так что и фиксить тут нечего.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Skynin
Дата 4.10.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 1
Всего: 10



Цитата

Пробовал, эти опции отсрочили эту проблему дня на 2-3, потом снова ошибка вылезла.

Общее описание причин такое:
В PermGen хранятся байт-код классов (и там же кажется нативный, когда класс подпал под JIT)
При этом уникальность класса обеспечивается не только именем а утрировано - контрольной суммой его байткода.
То есть, если наше приложение загружает класс с таким же именем но скомпилированной с изменениями в PermGen будут лежать оба.
Выгружаются они оттуда когда нет ни одного объекта класса Имя+СRC.
Получить утечку поэтому просто:
0. Запускаем программу в которой есть класс А
1. Создаем объект класса А, и время его жизни до завершения приложения.
2. Загружаем измененный класс А
повторяем пп 1 и 2 пока не получим OutOfMemoryError: PermGen space

А получим - однозначно smile

Еще в PermGen хранятся intern строки. То есть те что зашиты в коде String sss = "Hello world" и те что заброшены туда с помощью String.intern() Второе делают для увеличения быстродействия, можно будет сравнивать потом по == без equals.
Если появляются все новые строки при работе программы, и мы их String.intern(), то тоже жди OutOfMemoryError: PermGen space

На практике же происходит то что jk1 описал.
или ищите, кто держит объекты перезагружаемых классов (искать можно дооолго, и самое печальное, избавиться не перелопатив архитектуру может и не получится)

P.S.
Да, а держателем класса кажется нередко выступает очередной объект ClassLoader'a. То есть будет зависеть еще от способа загрузки измененных классов в работающее приложение.

Это сообщение отредактировал(а) Skynin - 4.10.2011, 15:14
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Stolzen
Дата 5.10.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 3
Всего: 48



Цитата(Skynin @  4.10.2011,  16:11 Найти цитируемый пост)
Еще в PermGen хранятся intern строки.

Насколько я понимаю, они собираются с помощью GC? http://www.codeinstructions.com/2009/01/bu...tern-myths.html (миф 3)

Мне вот интересно, это есть в спецификации или зависит от реализации JVM?


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.