|
|
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, все. Встала такая проблема. Имеется Web-приложение. Периодически, при выполнении юзверем определённого набора действий (составляется сложный запрос к базе, создаётся туча объектов и т.д.), где-то в недрах процедуры, которая это обрабатывает, вылетает java.lang.OutOfMemoryException. "Где-то в недрах процедуры" - в том смысле, что исключение возбуждается в ней, но сделать с нец ничего нельзя - нет исходников. Вопрос: если перед вызовом этой процедуры в отдельном потоке запустить System.gc(), как это может отразиться на производительности сервера приложений и какие могут быть побочные эффекты? Понимаю, что такой способ - это нездорово, но другого ничего на ум не идёт. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 22:27 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
В какой то умной статье, я читал про сборщик мусора, так там было написано, что после вызова метода gc() может произойти хз что, т.е. он может вызваться сразу же, может вызваться с очень большой задержкой или может вообще не вызваться, для вас это означает, что для одного клиента прокатит, а для других нет. А может у вас со временем увеличелась база, а прога написана таким образом, что лоижт результат запроса в какой нить кеш(LinkedList например) и происходит переполнение памяти, тогда только исходники помогут или JVM надо запускать с параметрами, которые указывают, чтобы ей(JVM) памяти побольше выделялось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 10:54 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
А можно ссылку привести на эту статью? Насчёт кэша Вы правы - он используется, но без него никак. Насчёт того, что System.gc() не всегда будет срабатывать - процедура, которая падает с исключением, используется, может, раза 4 в месяц, а то и меньше. Соответственно и System.gc() будет вызываться столько же. Главное, чтобы первый вызов прошёл. А если под JVM памяти больше выделять - тогда получится, что с ростом базы всё равно придём к исключению. Кстати, ещё вопрос - насколько System.gc() снижает производительность сервера? (А то может, проще перестартовать сервак, чем изобретать такие извраты :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 12:49 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
В документации Sun про сборщик мусора сказано, что он автоматически (прозрачно для пользователя) выполняется в отдельном потоке с низким приоритетом. В JavaDoc про gc() написано, что его вызов "предлагает" JVM приложить усилия для сборки мусора, и после того, как он gc() отработает, считается, что "мусор убран". Получается, в моём случае память выделяется быстрее, чем её успевает вернуть сборщик мусора. По-любому без gc() не обойтись. Вот только более подробно про его работу я ничего не нашёл. Теперь вопрос, собственно, сводится к следующему: гарантирует ли gc() начало сборки мусора, и насколько его выполнение загрузит сервер. Вложенный вопрос: если gc() вызвать не в отдельном потоке, сколько он будет выполняться? Протестировать это не могу, потому как кто ж даст на рабочей проге тестировать... А если сервер запустить локально на моей машине, то исключения OutOfMemory я могу сутками ждать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 13:10 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
C gc() я смотрю вы и сами разобрались, вот только есил у вас там кеш сделан, так как я предпологал(LinkedList к примеру) и метод падает именно из-за переполнения этого кеша, то gc() вам не поможет, т.к. убить этот объект он сможет только тогда, когда ссылка на него будет не доступна, а недоступна она будет только после заполнения этого кеша и вероятно после выхода из этого злополучного метода(а исключение происходит в момент заполнения) В нутри LinkedList сборщик мусора ничего чистить не может. Так что увеличевайте память для JVM и пока будет работать надо будетискать исходники :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 13:21 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Вызов System.gc() Вам абсолютно ничем не поможет! JVM самостоятельно вызывает сборщик мусора в случае нехватки памяти и происходит это как раз в отдельном потоке. Изначально этот поток имеет низкий приоритет (вот почему вызов gc() может вообще ничего не дать), при нехватки памяти приоритет потока в котором работает GC повышается. Ваша ошибка происходит потому, что программа берет памяти (для живых объектов!) больше чем выделено JVM (по умолчанию ~60M), этот параметр можно изменить указав ключ при запуске JVM (какой на память не скажу, но он есть :), хотя мне кажется, что у Вас в программе (если Вы не создаете кэш в 60М) просто остаются не убитые ссылки на ненужные объекты. Пока есть хоть одна ссылка на объект сборщик мусора ничего не может с ним сделать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 13:52 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Спасибо за разъяснения по поводу кэша :-) Но я очень сильно подозреваю, что память жрут мёртвые объекты, на которые уже никто не ссылается (ну специфика там такая, что их много плодится). В этом случае gc() поправит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2004, 20:56 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Если на объект больше нет ссылок, то да - gc() его очистит. Но иногда программеры пишут что-то вроде: Код: plaintext 1. 2. 3. объект удалить не сможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2004, 12:40 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
А насколько gc() загрузит сервер? Понимаю, что очень абстрактный вопрос, но хоть какие-нибудь оценки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2004, 16:21 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
ponomarevvbА насколько gc() загрузит сервер? Понимаю, что очень абстрактный вопрос, но хоть какие-нибудь оценки? Ненамного :) Даже думаю очень ненамного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2004, 16:45 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Всем спасибо :-) После обкатки решения обязательно сообщу результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2004, 19:45 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
Может, кому пригодятся результаты моих изысканий :-) Покопавшись в доках и попытавшись немного попрограммить :-), выяснил следующее (возможно, это зависит от реализации VM, но это не противоречит докам): 1. Приоритет сборки мусора действительно растёт при уменьшении объёма досупной памяти в куче. 2. а) Вызов System.gc() запускает сборку мусора ВСЕГДА. При тесте создал 1 объект, у которого в финализаторе печатал в консоль строку. После System.gc() сообщение напечаталось. б) Можно и не оформлять вызов gc() в отдельном потоке - поток ему и так выделят. Кстати, г-н wessen по поводу роста кэша был прав со страшной силой :-). Хотя кэш и был сделан на основе WeakHashMap, это не спасало, когда после запроса, который возвращал много данных, пользователь кидался выполнять ту самую зло###чую функцию. В качестве варианта решения проблем с кэшем в книжке "Горький вкус Java" советуют цеплять к объектам кэша временнЫе метки, а в отдельном потоке мониторить - если возраст объекта больше заданного удалять его из кэша. В моей же ситуации оказалось проще тупо очищать кэш перед выполнением этой страшной функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2004, 19:42 |
|
||
|
Вызов System.gc() в отдельном потоке
|
|||
|---|---|---|---|
|
#18+
ponomarevvbВызов System.gc() запускает сборку мусора ВСЕГДА. При тесте создал 1 объект, у которого в финализаторе печатал в консоль строку. После System.gc() сообщение напечаталось. Необъективное заявление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 09:04 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=32727905&tid=2153601]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 352ms |

| 0 / 0 |
