![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| fenix666 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 29.3.2008 Репутация: нет Всего: нет |
Занимаюсь разработкой веб-сервисов, которые вертятся на IBM WebSphere.
В последнее время стала возникать ошибка java.lang.OutOfMemoryError: PermGen space, результате чего сфера перестает отвечать. При этом ява запущена с опциями: -Xms256m -Xmx512m -XX:MaxPermSize=256m Обычно память разрастается во время очередного деплоя сервиса, но также и во время работы понемногу съедается. Есть ли способ получить содержимое этой памяти, чтобы увидеть какие классы загружены и занимают место? Либо иной способ, побороть ее? |
|||
|
||||
| Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 7.7.2006 Репутация: 3 Всего: 5 |
1. при запуске жабы можно этот пермген увеличить (опция -XX:MaxPermSize при запуске)
2. При переразвёртывании бинов/вебсервисов/проч. тащить за собой меньше классов. Т.е. надо основные зависимости скинуть в папку lib, и не переразвёртывать их каждый раз. -------------------- Таково моё общее мнение. |
|||
|
||||
| Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 1 Всего: 10 |
Попробовать добавить еще:
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled |
|||
|
||||
| fenix666 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 29.3.2008 Репутация: нет Всего: нет |
Пробовал, эти опции отсрочили эту проблему дня на 2-3, потом снова ошибка вылезла. |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 1 Всего: 8 |
Возможно твоему сервису просто не хватает места. Разростается куча и наезжает на область PermGen. Т.е. можно просто увеличить область кучи, хотя бы до гига (-Xms1024m -Xmx1024m), и посмотреть что произойдет.
А возможно у тебя где то происходит утечка памяти, и тогда нужно дебажить. С JDK поставляется спец утилита, которая может помочь тебе в этом: jconsole.exe. Это сообщение отредактировал(а) priam220 - 4.10.2011, 10:00 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 5 Всего: 538 |
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. |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 5 Всего: 75 |
Perm gen memory leak часто возникает при редеплое "вгорячую". Разумеется, в production такого происходить не будет, так что и фиксить тут нечего. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 1 Всего: 10 |
Общее описание причин такое: В PermGen хранятся байт-код классов (и там же кажется нативный, когда класс подпал под JIT) При этом уникальность класса обеспечивается не только именем а утрировано - контрольной суммой его байткода. То есть, если наше приложение загружает класс с таким же именем но скомпилированной с изменениями в PermGen будут лежать оба. Выгружаются они оттуда когда нет ни одного объекта класса Имя+СRC. Получить утечку поэтому просто: 0. Запускаем программу в которой есть класс А 1. Создаем объект класса А, и время его жизни до завершения приложения. 2. Загружаем измененный класс А повторяем пп 1 и 2 пока не получим OutOfMemoryError: PermGen space А получим - однозначно Еще в 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 |
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 3 Всего: 48 |
Насколько я понимаю, они собираются с помощью GC? http://www.codeinstructions.com/2009/01/bu...tern-myths.html (миф 3) Мне вот интересно, это есть в спецификации или зависит от реализации JVM? |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |