![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Barvetal |
|
|||
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 181 Регистрация: 31.10.2005 Репутация: 5 Всего: 5 |
Всем привет!
Раньше программил на С++. Там все созданные объекты нужно было освобождать. В java вроде как не надо. Однако возникает вопрос. Может, все-таки объекты освобождать вручную нужно? А то JavaHeapSpaceException уже задолбал. Даю 256 метров памяти, вроде данных не так уж и много... Вобщем, вопрос такой. Нужно ли в java освобождать объекты? Всем спасибо! |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 5 Всего: 538 |
Нужно обнулять ссылки на неиспользуемые объекты, и тогда garbage collector их сможет убрать.
-------------------- 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. |
|||
|
||||
Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Он их сразу убирает или как-нибудь потом в фоне?
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 5 Всего: 538 |
Когда будет вызван GC не известно (зависит от реализации JVM), но гарантируется что GC будет вызван перед тем как будет выкинуто OutOfMemoryError.
-------------------- 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. |
|||
|
||||
chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 11 Всего: 77 |
Можно так же ускорить вызов коллектора(но не гарантировать что сейчас же ) строчкой:
-------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Может код кривой? |
|||
|
||||
Lerm |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 7.12.2004 Где: Москва, Россия Репутация: 2 Всего: 4 |
Только лучше всё таки так не делать - не стоит явно вмешиваться в работу GC. Это может потребоваться только в очень ограниченном количестве случаев. Появление проблем с памятью в большинстве случаев говорит о том, что либо имеется её утечка (копим неиспользуемые объекты), либо памяти просто выделено недостаточно (не рассчитали нужный объем, необходимый для хранения всех требуемых объектов). Кстати, я в первый раз слышу про такой Exception - JavaHeapSpaceException. Какой точно Exception выскакивает - OutOfMemoryError или что-то другое? На Unix-системах иногда вылетает Exception c not enough space при попытке вызвать сторонний процесс (fork не может память зарезервировать). А иногда (это особенно характерно для серверов приложений) OutOfMemoryError может свидетельствовать не о недостатке кучи, а нехватки Permanent-области. Так что без дополнительных сведений о приложении и том, как оно работает с памятью - сказать что-нибудь по проблеме сложно. |
||||
|
|||||
JUncle |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 6.4.2006 Где: Казань, РФ Репутация: нет Всего: 1 |
Например при отладке. В других случаях его применение сомнительно. (Хотя, нравится как в IDEA сделано - иконка с корзиной, нажатие на которую вызывает gc - но там это не грозит потерей производительности - ибо сам нажал, сам и подождешь ![]() --------------------
class JUncle extends Man // singleton{/*...*/} |
|||
|
||||
COVD2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 10.6.2006 Репутация: нет Всего: 1 |
Java широко используется в серверных приложениях. Серверные приложения работают как правило круглосуточно. Причем активность пользователей может носить периодический характер. Например, максимум запросов днем и минимум - ночью. В этой ситуации естественно хочется явно запускать коллектор, чтобы в периоды простоя он почистил память, на всякий случай, чтобы в периоды активности ему меньше работы было. Однако явно управлять уборщиком мусора нельзя. Можно только "порекомендовать" ему заняться делом в виде многократных вызовов System.gc(). Одной из стратегий в данной ситуации является аккуратное программирование - по возможности "не мусорить". Не создавать без особой нужды новые обьекты, использовать пулы. Однако это идет в разрез с концепцией обьектно-ориентированного программирования. Как и любой другой тюнинг, это повышает эффективность, но делает программу более сложной. В то же время в последних версиях java уборка мусора может реализовываться в фоновом режиме, что менее болезненно для приложения. |
|||
|
||||
Lerm |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 7.12.2004 Где: Москва, Россия Репутация: 2 Всего: 4 |
Ну, для нормального серверного приложения одно выполнение FullGC ночью вероятно ничего не даст - в течение дня он будет вызван не один раз. Я вижу применение вызова System.gc() только в тестовых и отладочных целях - когда мы хотим, скажем, замерить потребление памяти при выполнении некоторой операции.
Смотря для какого приложения. Для интерактивного приложения, которое должно всегда отзываться на действия пользователя - вероятно да, более полезно. Для серверных приложений, которые обрабатывают поток запросов, это хуже - проще в какой-то момент прерваться, бросить все силы на сборку мусора, а затем вернуться к работе - сумарная пропускная способность окажется выше. |
||||
|
|||||
COVD2 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 10.6.2006 Репутация: нет Всего: 1 |
Да, для нормального приложения, которое ни в чем себе не отказывая плодит одноразовые обьекты, это не поможет. А постоянные обьекты (кэш) в некоторых случаях ведут себя вполне предсказуемо. И можно определенно сказать сколько надо памяти приложению в начале цикла (утром) и насколько она возрастет к вечеру. ...
Вот вы прерветесь, а входящие запросы придется в буфер класть, и буфер переполнится, и запросы потеряются. ![]() И все же жаль, что нет в java способов короткой и беспощадной расправы с обьектами. Видимо, это противоречит трудовому соглашению с профсоюзом уборщиков мусора. |
||||
|
|||||
COVD2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 10.6.2006 Репутация: нет Всего: 1 |
Вот нашел http://java.sun.com/docs/hotspot/gc1.4.2/faq.html:
31. Should I pool objects to help GC? Should I call System.gc() periodically? The answer to these is No! Pooling objects will cause them to live longer than necessary. We strongly advise against object pools. Don't call System.gc(). The system will make the determination of when it's appropriate to do garbage collection and generally has the information necessary to do a much better job of initiating a garbage collection. If you are having problems with the garbage collection (pause times or frequency), consider adjusting the size of the generations. |
|||
|
||||
y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 7 Всего: 13 |
вообще, раз уж речь пошла о промышленном софте, то тут без профайлера не обойтись. Правда я бесплатных не знаю, точнее знаю только один JProfiler ![]() имхо, проставление ссылок в null это, конечно, хорошо, но сильно отвлекает от процесса разработки. Обычно чтобы не шаманить таким образом нужно внимательно изучить код и посмотреть на области видимости переменных, чтобы они были как можно уже. Об этом хорошо написано у Дж. Блоха. Это сообщение отредактировал(а) y3u - 10.9.2006, 00:27 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
COVD2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 10.6.2006 Репутация: нет Всего: 1 |
Полезно также вывести в лог сообщения gc (опция -Xloggc: ).
- т.е. идеально, чтобы все переменные были локальными. Тогда в каждом методе будут в изобилии создаваться и умирать новые локальные обьекты (если переменные не примитивные типы). Собственно , и Sun тоже не призывает экономить на обьектах. Работать должна машина ( gc ), а не человек. ![]() |
|||
|
||||
y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 7 Всего: 13 |
а в этом нет ничего плохого, эти переменные будут доступны при сборке сразу же, как только отработает метод, где у них кончается скоуп. Они-то, как раз, будут убраны гарантировано. А вот с подвисшими в памяти объектами которые не нужны, но вот по какой-нибудь потеряной ссылке все еще цепляющиеся за жизнь, разобраться куда сложнее, бывает и такое... Кстати, а в коммерческих JVM все должно быть в этом плане радужнее, мне тут говорили, что на джей роките скорость работы приложений и эффективность гарбадж коллектора примеро в 2 раза больше, чем у штатной джавамашины... Кто-нибудь может что-либо сказать по этому поводу? Интересно... -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |