Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите настроить GarbageCollector


Автор: KostenkoSergey 4.11.2005, 10:18
Суть проблемы :
На продакшен-сервере переодицки вылазит OutOfMemory.
Как известно GarbageCollector запускается когда свободной памяти остаётся мало.
Но при таких раскладах у меня сервер ,как я понимаю, съедает остаток памяти быстрее чем успевает отработать сборщик. (например построил DOM-модель метров на 100)

Я где то слышал, что можно настроить сборщик таким образом, что бы он постоянно работал на фоне, а не запускался, когда памяти не хватает... (о нагрузке на проц пока не говорим, т.к. в наши дни он редко загружен на все 100 smile)

Ну или крайне полезной оказалась бы опция позволяющая запускать GarbageCollector ,скажем, каждые 30 минут ...

Кто что думает по этому поводу ?
Заранее благодарен. smile

Автор: 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
Цитата(Lamer @ 4.11.2005, 10:33)
Вот этот документ смотрел? Может, там что-нибудь есть.
http://java.sun.com/docs/hotspot/gc1.4.2/index.html
Ну и можно, конечно, просто стартовать System.gc() по таймеру, но гарантий - никаких...

смотрел конечно, но ответов не нашёл, к сожалению .... может мой английский меня подвёл, а мож и нема smile

System.gc() - такая мыслишка меня посещала, но как то уж притянуто за ухи, мне кажется ....
Да и сервер энто... чё там такого работать с таймером могёт? MDB чтоль...

smile

Автор: LSD 4.11.2005, 12:32
Цитата(JavaDoc)
public class OutOfMemoryError

extends VirtualMachineError

Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.

Так что переодический запуск тебе не поможет, GarbageCollector всегда запускается перед тем как выкинуть OutOfMemoryError.

Автор: KostenkoSergey 4.11.2005, 13:45
Цитата(LSD @ 4.11.2005, 12:32)
Так что переодический запуск тебе не поможет, GarbageCollector всегда запускается перед тем как выкинуть OutOfMemoryError.

я писал, что
Но при таких раскладах у меня сервер ,как я понимаю, съедает остаток памяти быстрее чем успевает отработать сборщик. (например построил DOM-модель метров на 100)

запустить принутиельно можно - gc() .... только вот как это сделать пораньше....
есть ли опции smile VM

Может конечно мне и не поможет smile но
smile

Автор: tux 4.11.2005, 16:29
Цитата(KostenkoSergey @ 4.11.2005, 18:45)
есть ли опции smile VM

Опции-то есть, только в двух словах их не опишешь.
В первую очередь посоветовал бы при запуске сервера задать опцию -verbose:gc или -Xloggc:file. Делают они одно и то же - выдают лог работы сборщика мусора, только вторая выдает лог в указанный файл. По крайней мере можно определить когда он запускался и была ли попытка освободить память прежде чем вылетело исключение.

Далее, возможно поможет установка ключа -Xincgc, который включает более предсказуемый инкрементный сборщик мусора. Правда при этом несколько падает производительность. Если ничего не поможет, можно поиграть с ключами HotSpot, которые описаны http://java.sun.com/docs/hotspot/VMOptions.html. Однако, этот процесс уже вряд ли можно четко описать.

Вспомнил вот еще один метод. Периодически по мере построения того же DOM можно выполнять что-нибудь похожее на такой код:
Код

public static void fullGC() {
    Runtime rt = Runtime.getRuntime();
    long isFree = rt.freeMemory();
    long wasFree;
 
    do {
        wasFree = isFree;
        rt.runFinalization();
        rt.gc();
        isFree = rt.freeMemory();
    while (isFree > wasFree);
}

Он в конце концов гарантирует, что сборщик мусора принялся таки за дело. Согласен, выглядит несколько безумно smile Но придумал это не я, метод описан в книге Арнольда и Гослинга. Если уж Гослинг рекомендует... smile

Автор: COVD 4.11.2005, 17:11
Цитата
На продакшен-сервере переодицки вылазит OutOfMemory.


Обычно это результат ошибки программирования и gc бессилен тут помочь.

Автор: KostenkoSergey 4.11.2005, 17:24
интересный примерчк smile спасибо.
Беда только, что он время отклика на запрос увеличивает на порядок...

2COVD : offtopic (возможно, хотя я бы не был таким категоричным в подобного рода заявлениях)

Автор: LSD 5.11.2005, 15:59
Цитата(KostenkoSergey @ 4.11.2005, 13:45)
Но при таких раскладах у меня сервер ,как я понимаю, съедает остаток памяти быстрее чем успевает отработать сборщик. (например построил DOM-модель метров на 100)

Я считал, что на время запуска GC все треды останавливаются, разве нет?
В любом случае смоделировать подобную ситуацию мне не удалось (создал 4 потока которые активно "мусорят", но OutOfMemory так и не получил).

Автор: chief39 6.11.2005, 18:01
Цитата(LSD @ 5.11.2005, 15:59)
Я считал, что на время запуска GC все треды останавливаются, разве нет?

Если не ошибаюсь, большинство jvm запускает сборщик в двух режимах.
Не скажу точно как называются, но суть такова, что один режим - это подчистка без особых замедлений(вроде как удаление файла), а второй запускается когда уже первый режим не помогает - он останавливает треды, подчищает всё и стягивает до кучи(а-ля дефрагментация диска). Кажется у Эккеля есть абзацик по сему поводу.
Кажется на сановской машине именно так и реализовано было(для 1.2 -1.3). Ещё приводилось сравнение джавовской кучи с конвейером, чем она выгодно отличалась от куч хотя бы того же C++.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)