| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Помогите настроить GarbageCollector |
| Автор: KostenkoSergey 4.11.2005, 10:18 |
| Суть проблемы : На продакшен-сервере переодицки вылазит OutOfMemory. Как известно GarbageCollector запускается когда свободной памяти остаётся мало. Но при таких раскладах у меня сервер ,как я понимаю, съедает остаток памяти быстрее чем успевает отработать сборщик. (например построил DOM-модель метров на 100) Я где то слышал, что можно настроить сборщик таким образом, что бы он постоянно работал на фоне, а не запускался, когда памяти не хватает... (о нагрузке на проц пока не говорим, т.к. в наши дни он редко загружен на все 100 Ну или крайне полезной оказалась бы опция позволяющая запускать GarbageCollector ,скажем, каждые 30 минут ... Кто что думает по этому поводу ? Заранее благодарен. |
| Автор: batigoal 4.11.2005, 10:33 |
| Вот этот документ смотрел? Может, там что-нибудь есть. http://java.sun.com/docs/hotspot/gc1.4.2/index.html Ну и можно, конечно, просто стартовать System.gc() по таймеру, но гарантий - никаких... |
| Автор: KostenkoSergey 4.11.2005, 10:47 | ||
смотрел конечно, но ответов не нашёл, к сожалению .... может мой английский меня подвёл, а мож и нема System.gc() - такая мыслишка меня посещала, но как то уж притянуто за ухи, мне кажется .... Да и сервер энто... чё там такого работать с таймером могёт? MDB чтоль... |
| Автор: LSD 4.11.2005, 12:32 | ||
Так что переодический запуск тебе не поможет, GarbageCollector всегда запускается перед тем как выкинуть OutOfMemoryError. |
| Автор: KostenkoSergey 4.11.2005, 13:45 | ||
я писал, что Но при таких раскладах у меня сервер ,как я понимаю, съедает остаток памяти быстрее чем успевает отработать сборщик. (например построил DOM-модель метров на 100) запустить принутиельно можно - gc() .... только вот как это сделать пораньше.... есть ли опции Может конечно мне и не поможет |
| Автор: tux 4.11.2005, 16:29 | ||||
Опции-то есть, только в двух словах их не опишешь. В первую очередь посоветовал бы при запуске сервера задать опцию -verbose:gc или -Xloggc:file. Делают они одно и то же - выдают лог работы сборщика мусора, только вторая выдает лог в указанный файл. По крайней мере можно определить когда он запускался и была ли попытка освободить память прежде чем вылетело исключение. Далее, возможно поможет установка ключа -Xincgc, который включает более предсказуемый инкрементный сборщик мусора. Правда при этом несколько падает производительность. Если ничего не поможет, можно поиграть с ключами HotSpot, которые описаны http://java.sun.com/docs/hotspot/VMOptions.html. Однако, этот процесс уже вряд ли можно четко описать. Вспомнил вот еще один метод. Периодически по мере построения того же DOM можно выполнять что-нибудь похожее на такой код:
Он в конце концов гарантирует, что сборщик мусора принялся таки за дело. Согласен, выглядит несколько безумно |
| Автор: COVD 4.11.2005, 17:11 | ||
Обычно это результат ошибки программирования и gc бессилен тут помочь. |
| Автор: KostenkoSergey 4.11.2005, 17:24 |
| интересный примерчк Беда только, что он время отклика на запрос увеличивает на порядок... 2COVD : offtopic (возможно, хотя я бы не был таким категоричным в подобного рода заявлениях) |
| Автор: LSD 5.11.2005, 15:59 | ||
Я считал, что на время запуска GC все треды останавливаются, разве нет? В любом случае смоделировать подобную ситуацию мне не удалось (создал 4 потока которые активно "мусорят", но OutOfMemory так и не получил). |
| Автор: chief39 6.11.2005, 18:01 | ||
Если не ошибаюсь, большинство jvm запускает сборщик в двух режимах. Не скажу точно как называются, но суть такова, что один режим - это подчистка без особых замедлений(вроде как удаление файла), а второй запускается когда уже первый режим не помогает - он останавливает треды, подчищает всё и стягивает до кучи(а-ля дефрагментация диска). Кажется у Эккеля есть абзацик по сему поводу. Кажется на сановской машине именно так и реализовано было(для 1.2 -1.3). Ещё приводилось сравнение джавовской кучи с конвейером, чем она выгодно отличалась от куч хотя бы того же C++. |