powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов System.gc() в отдельном потоке
14 сообщений из 14, страница 1 из 1
Вызов System.gc() в отдельном потоке
    #32726963
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, все.
Встала такая проблема.
Имеется Web-приложение. Периодически, при выполнении юзверем определённого набора действий (составляется сложный запрос к базе, создаётся туча объектов и т.д.), где-то в недрах процедуры, которая это обрабатывает, вылетает java.lang.OutOfMemoryException.
"Где-то в недрах процедуры" - в том смысле, что исключение возбуждается в ней, но сделать с нец ничего нельзя - нет исходников.

Вопрос: если перед вызовом этой процедуры в отдельном потоке запустить System.gc(), как это может отразиться на производительности сервера приложений и какие могут быть побочные эффекты?
Понимаю, что такой способ - это нездорово, но другого ничего на ум не идёт.
Заранее спасибо.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32727438
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В какой то умной статье, я читал про сборщик мусора, так там было написано, что после вызова метода gc() может произойти хз что, т.е. он может вызваться сразу же, может вызваться с очень большой задержкой или может вообще не вызваться, для вас это означает, что для одного клиента прокатит, а для других нет.
А может у вас со временем увеличелась база, а прога написана таким образом, что лоижт результат запроса в какой нить кеш(LinkedList например) и происходит переполнение памяти, тогда только исходники помогут или JVM надо запускать с параметрами, которые указывают, чтобы ей(JVM) памяти побольше выделялось.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32727815
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно ссылку привести на эту статью?

Насчёт кэша Вы правы - он используется, но без него никак.
Насчёт того, что System.gc() не всегда будет срабатывать - процедура, которая падает с исключением, используется, может, раза 4 в месяц, а то и меньше. Соответственно и System.gc() будет вызываться столько же. Главное, чтобы первый вызов прошёл.
А если под JVM памяти больше выделять - тогда получится, что с ростом базы всё равно придём к исключению.

Кстати, ещё вопрос - насколько System.gc() снижает производительность сервера? (А то может, проще перестартовать сервак, чем изобретать такие извраты :-)
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32727905
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации Sun про сборщик мусора сказано, что он автоматически (прозрачно для пользователя) выполняется в отдельном потоке с низким приоритетом.
В JavaDoc про gc() написано, что его вызов "предлагает" JVM приложить усилия для сборки мусора, и после того, как он gc() отработает, считается, что "мусор убран".
Получается, в моём случае память выделяется быстрее, чем её успевает вернуть сборщик мусора. По-любому без gc() не обойтись. Вот только более подробно про его работу я ничего не нашёл.
Теперь вопрос, собственно, сводится к следующему: гарантирует ли gc() начало сборки мусора, и насколько его выполнение загрузит сервер. Вложенный вопрос: если gc() вызвать не в отдельном потоке, сколько он будет выполняться?
Протестировать это не могу, потому как кто ж даст на рабочей проге тестировать...
А если сервер запустить локально на моей машине, то исключения OutOfMemory я могу сутками ждать...
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32727941
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C gc() я смотрю вы и сами разобрались, вот только есил у вас там кеш сделан, так как я предпологал(LinkedList к примеру) и метод падает именно из-за переполнения этого кеша, то gc() вам не поможет, т.к. убить этот объект он сможет только тогда, когда ссылка на него будет не доступна, а недоступна она будет только после заполнения этого кеша и вероятно после выхода из этого злополучного метода(а исключение происходит в момент заполнения) В нутри LinkedList сборщик мусора ничего чистить не может.

Так что увеличевайте память для JVM и пока будет работать надо будетискать исходники :))
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32728045
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызов System.gc() Вам абсолютно ничем не поможет!
JVM самостоятельно вызывает сборщик мусора в случае нехватки памяти
и происходит это как раз в отдельном потоке. Изначально этот поток имеет
низкий приоритет (вот почему вызов gc() может вообще ничего не дать), при
нехватки памяти приоритет потока в котором работает GC повышается.
Ваша ошибка происходит потому, что программа берет памяти (для живых объектов!) больше чем выделено JVM (по умолчанию ~60M), этот параметр
можно изменить указав ключ при запуске JVM (какой на память не скажу, но
он есть :), хотя мне кажется, что у Вас в программе (если Вы не создаете кэш в 60М) просто остаются не убитые ссылки на ненужные объекты.
Пока есть хоть одна ссылка на объект сборщик мусора ничего не может с ним
сделать :(
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32728917
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за разъяснения по поводу кэша :-)
Но я очень сильно подозреваю, что память жрут мёртвые объекты, на которые уже никто не ссылается (ну специфика там такая, что их много плодится). В этом случае gc() поправит?
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32729741
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на объект больше нет ссылок, то да - gc() его очистит.
Но иногда программеры пишут что-то вроде:
Код: plaintext
1.
2.
3.
Object o1=new Object();
Object o2=o1;
o1=null;
В этом случае ссылка на объект сохранилась в o2 и сборщик мусора такой
объект удалить не сможет.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32730387
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насколько gc() загрузит сервер? Понимаю, что очень абстрактный вопрос, но хоть какие-нибудь оценки?
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32730444
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponomarevvbА насколько gc() загрузит сервер? Понимаю, что очень абстрактный вопрос, но хоть какие-нибудь оценки?
Ненамного :) Даже думаю очень ненамного.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32730812
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо :-)
После обкатки решения обязательно сообщу результаты.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32737171
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, кому пригодятся результаты моих изысканий :-)
Покопавшись в доках и попытавшись немного попрограммить :-), выяснил следующее (возможно, это зависит от реализации VM, но это не противоречит докам):

1. Приоритет сборки мусора действительно растёт при уменьшении объёма досупной памяти в куче.
2.
а) Вызов System.gc() запускает сборку мусора ВСЕГДА. При тесте создал 1 объект, у которого в финализаторе печатал в консоль строку. После System.gc() сообщение напечаталось.
б) Можно и не оформлять вызов gc() в отдельном потоке - поток ему и так выделят.

Кстати, г-н wessen по поводу роста кэша был прав со страшной силой :-). Хотя кэш и был сделан на основе WeakHashMap, это не спасало, когда после запроса, который возвращал много данных, пользователь кидался выполнять ту самую зло###чую функцию.
В качестве варианта решения проблем с кэшем в книжке "Горький вкус Java" советуют цеплять к объектам кэша временнЫе метки, а в отдельном потоке мониторить - если возраст объекта больше заданного удалять его из кэша.
В моей же ситуации оказалось проще тупо очищать кэш перед выполнением этой страшной функции.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32737474
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponomarevvbВызов System.gc() запускает сборку мусора ВСЕГДА. При тесте создал 1 объект, у которого в финализаторе печатал в консоль строку. После System.gc() сообщение напечаталось.

Необъективное заявление.
...
Рейтинг: 0 / 0
Вызов System.gc() в отдельном потоке
    #32739395
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Timm
Возможно. Я сделал приписку в скобках, что сказанное мной может зависеть от VM. Просто у меня происходило так, как описано.
Я не претендую на истину в последней инстанции :-)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов System.gc() в отдельном потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]