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


Автор: Proger10 29.1.2009, 17:23
Вопрос такой. В больших программах создаётся много экземпляров классов. И эти классы бывают огромных размеров.
Когда не нужны какие-то созданные экземпляры классов, нужно ли их удалять? Чтобы разгрузить память.. Если они в данное время не нужны, чего их в памяти-то держать, прально?

Как создавать в книгах пишу, а вот как удалять их чего-то я ещё не сталкивался smile

Автор: almagnit 29.1.2009, 17:38
Точно не знаю, но количество загружаемых в программу класов через import влияет на время загрузки программы, а в процессе работы

Java самостоятельно регулирует загруженность имеющейся памяти.

Автор: fixxer 29.1.2009, 17:49
Обнуляй ненужные ссылки, в Java встроен Ктулху, он объекты сам зохавает потом smile

Автор: Proger10 29.1.2009, 19:34
Обнулять ненужные ссылки это что имеется ввиду?
Что-то типа:
Код

MyClass myClass = new MyClass();
//...поработали с классом и как не нужен стал:
myClass = null;

типа такого?

Автор: vdim 29.1.2009, 21:49
по научному Ктулху называется сборщик мусора. Периодически он прогоняет программу на предмет не используемых ссылок и сам их удаляет. Из-за чего java считается тормознутой ибо найти все, что не используется, это не delete на совесть программистам оставить. 

Автор: Proger10 30.1.2009, 10:24
А нельзя ли отключать этот сборщик мусора? Чтобы тормоза оставить на совесть программиста.

Так что-то и не очень понял я, нужно ли таким образом удалять то, что в данный момент не нужно (экземпляры созданных классов) или постоянно хранить их в памяти?

Автор: math64 30.1.2009, 10:35
Сборщик мусора отключить нельзя, можно только меньше мусорить или помогать мусорщику, устанавливая указатели на ненужные объекты в null.

Автор: Skynin 30.1.2009, 10:45
Помочь сборщику мусора можно еще с помощью http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/WeakReference.html
Обычное применение - держать так большие кэшируемые данные, которые можно перечитать, если их уже Ктулху зохавал.

Автор: JSpark 30.1.2009, 10:57
Цитата(Proger10 @ 30.1.2009,  10:24)
А нельзя ли отключать этот сборщик мусора? Чтобы тормоза оставить на совесть программиста.

Разработчики java как раз уходили от ручного удаления объектов, в отличии от си, для этого был разработан сборщик мусора. Данный подход позволяет сократить время на разработку, так как частая ошибка в си коде, это забывание удалить ненужные объекты, после чего такие программы становятся не работоспособными и на исправление тратится время. 

Цитата(Proger10 @ 30.1.2009,  10:24)
Когда не нужны какие-то созданные экземпляры классов, нужно ли их удалять? Чтобы разгрузить память.. 

Конечно надо, это делается присвоением null объекту после чего сборщик мусора сам удалит объект. 
 В принципе можешь не занулять к примеру в таком случае: ты создал локальный объект и после отработки метода он будет все равно собран ну конечно если только он не возвращается из этой функции, сборщик удаляет объекты на которые в программе больше нет ссылок.


Автор: ecologist 30.1.2009, 11:01
Да вообщем еще хорошо посмотреть как можно настроить параметры сборщика мусора - его влияние можно снизить кардинально.

От того, что ты будешь обнулять ссылки - легче не станет. Это же ссылки - т.е. они ссылаются на объект в памяти. Все равно процесс удаления объектов берет на себя Ктулху.

Читайте маны - http://java.sun.com/javase/technologies/hotspot/gc/index.jsp

А для настройки (прямо оттуда) - 
Java 1.5 - http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Java 1.4 - http://java.sun.com/docs/hotspot/gc1.4.2/

Читайте

Автор: Proger10 30.1.2009, 12:07
Цитата
От того, что ты будешь обнулять ссылки - легче не станет. Это же ссылки - т.е. они ссылаются на объект в памяти. Все равно процесс удаления объектов берет на себя Ктулху.

но.. есть ли тогда смысл заNULLять ненужные объекты?

Автор: fixxer 30.1.2009, 12:55
Цитата(Proger10 @ 30.1.2009,  12:07)
Цитата
От того, что ты будешь обнулять ссылки - легче не станет. Это же ссылки - т.е. они ссылаются на объект в памяти. Все равно процесс удаления объектов берет на себя Ктулху.

но.. есть ли тогда смысл заNULLять ненужные объекты?

Пока есть хотя бы одна ссылка на объект он не может быть зохаван.

Автор: AntonSaburov 30.1.2009, 13:06
Цитата(fixxer @  30.1.2009,  12:55 Найти цитируемый пост)
Пока есть хотя бы одна ссылка на объект он не может быть зохаван. 

Наиболее часто обнуление происходит при работе с локальными переменными - т.е. к окончанию работы функции. Локаные переменные "завершают" свою работу и обнуляюся. И в подавляющем большинстве случаев их досрочное обнуление мало что решает. Так что я бы не заморачивался. Тут ecologist в какой-то мере прав.

Автор: math64 31.1.2009, 00:40
Есть один случай (а можеть быть и больше) когда нужно специальное зануление:
Нитка крутится в бесконечном цикле, пока не установлено terminate = true, связанные с ней ресурсы не будут удалены
Код

boolean terminate;
void run() {
  while(!terminate) { ... }
}


Автор: VSergeyV 2.2.2009, 10:17
Цитата(vdim @  29.1.2009,  21:49 Найти цитируемый пост)
Периодически он прогоняет программу на предмет не используемых ссылок и сам их удаляет. 

Можно сделать это принудительно
Код

System.gc();

gc() - Runs the garbage collector.

В IDE IntelliJ IDEA в углу есть градусник - сколько памяти занято и кнопка чтобы юзер мог сам вызывать garbage collector.

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