Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как корректно удалить объект из памяти? который больше не нужен 
V
    Опции темы
javastic
Дата 25.4.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



делаем экземпляр класса, он выполняет какую-то задачу, затем я хочу его убрать из памяти т.к. он больше не нужен (это может быть полезно при использовании splash скринов, About'ов и тд.
smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 25.4.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



MyObject=null;

System.gc();
PM MAIL WWW ICQ   Вверх
batigoal
Дата 25.4.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 1
Всего: 151



А разве нужен явный вызов сборщика мусора? Он ведь и сам должен периодически чиститься...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Cr@$h
Дата 25.4.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Да. И его вызывать даже не рекомендуют, это может замедлить раюоты, кроме него никто не знает, когда он запускался.
PM MAIL ICQ   Вверх
javastic
Дата 25.4.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



То что сборщик мусора этим занимается это понятно (после завершения! приложения, но не в процессе выполнения), но как быть если было создано
много объектов или несколько, но больших?
Развивая далее эту тему хотелось бы узнать насколько связана RMS память для мидлета и его общий размер?
Это одно пространство или разделённое? Я просто боюсь что при создании большого числа объектов отнимится память для RMS.

Это сообщение отредактировал(а) javastic - 25.4.2005, 14:09


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
batigoal
Дата 25.4.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 1
Всего: 151



Не знаю, как это организуется в j2me, но вроде обычно GC запускается автоматически при нехватке памяти, так что он отработает и в процессе работы приложения.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Cr@$h
Дата 25.4.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Не уверен, что во ремя приложения не происходит зачистки!
PM MAIL ICQ   Вверх
javastic
Дата 25.4.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Ладненько, спасибо. Будем запущать отладчики.
smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Stalnoj
Дата 14.5.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 20.10.2004

Репутация: нет
Всего: 2



Вообще в j2me как-то криво иногда память чистится. Порой просто присвоить объекту null бывает недостаточно. Мой совет такой, если этот объект класс, то создать в этом классе метод
destroy(), в нем всем объектам класса присвоить нули (включая и строки). А потом вызывать

myObject.destroy();
myObject = null;

Если этот объект, к примеру, Vector (да еще если это вектор объектов какого-то класса), то я бы рекомендовал вначале занулить все объекты вектора, а потом уже и сам вектор.

В общем не ждите, что java все сделает за вас smile

А вот Sуstem.gc() я бы не рекомендовал использовать. Во всяком случае крайне редко. Ну, например, если у вас какая-нибудь игра, где происходит переход из меню в игровой режим. При этом большое количество ресурсов выгружается и загружается в память. Тогда есть резон один раз! в конце этого процесса вызвать gc(). В процессе же игры этого делать не стоит. Во-первых, это тормозит приложение (видно даже на глаз - игру как бы цепляет). Во-вторых, java сделает это за вас когда будет нужно smile И, кстати, вызов gc() вручную и вызов автоматически ничем по качеству чистки не отличаются! Так что если у вас утечка памяти, то хоть вы через каждые пять секунд gc() вызывать будете, лучше от этого не станет smile

Это сообщение отредактировал(а) Stalnoj - 14.5.2005, 18:01
PM MAIL   Вверх
hTonus
Дата 10.4.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.3.2007

Репутация: нет
Всего: нет



Цитата(javastic @ 25.4.2005,  14:08)
То что сборщик мусора этим занимается это понятно (после завершения! приложения, но не в процессе выполнения), но как быть если было создано
много объектов или несколько, но больших?
Развивая далее эту тему хотелось бы узнать насколько связана RMS память для мидлета и его общий размер?
Это одно пространство или разделённое? Я просто боюсь что при создании большого числа объектов отнимится память для RMS.

heap мидлета и RMS память это разные вещи. 

Код

try {
    RecordStore rs = RecordStore.openRecordStore("rs_name",true);
    int freeMem = rs.getSizeAvailable();
} catch ( RecordStoreException ex ) {}



PM MAIL   Вверх
javastic
Дата 10.4.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



hTonus, спасибо!  smile Но это было уже давно, когда я только начал свои эксперименты.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Sopromat
Дата 7.11.2007, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.11.2007

Репутация: нет
Всего: нет



Да..
Утечка памяти - это большая проблема и закрывать эту тему не стоит!!!
Коллектор кстати по видимому только когда ссылки с объектом очевидно разорваны, либо когда нехватает памяти... в остальных случаях - утечка...

Я с этим столкнулся когда писал одну прогу.....
На мобиле пользуешься - пользуешься, а потом бац!!! Ошибка !! И вылетает. И это из-за нехватки памяти.

Добавлено через 2 минуты и 56 секунд
Кстати вот Вам пример....

Что будет происходить с памятью?

Код

O = new Object();
O.method1();
...
...
O = new Object();




PM MAIL   Вверх
W0LF
Дата 7.11.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Первая строка выделяет память под объект, ссылка указывает на него.
Потом вызывается его метод, если этот метод не переприсваивает эту память другой ссылке? то последняя трока выделяет новую память и теперь ссылка O указывает на нее, то что было выделено ранее остается в памяти, на него нет ссылок, когда будет нехватать памяти, пройдется GC и удалит ее

Добавлено через 2 минуты и 43 секунды
Цитата

Над разработкой алгоритма работы GC довольно долго корпели разработчики, так что иногда его поведение может показаться несколько странным. В частности, он может освобождать объекты в произвольном порядке, никак не связанном с порядком их создания или очистки последних ссылок на них. Так же, для примера, в JDK 1.3, GC начинает освобождать объекты только тогда, когда текущий пул памяти заполняется. При этом одновременно, этот пул расширяется, пока не дойдёт до заданного верхнего лимита. Одновременно учитывается время последнего доступа и размер объекта. И т.д. и т.п.



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1062 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.