Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java ME (J2ME) > Как корректно удалить объект из памяти? |
Автор: javastic 25.4.2005, 13:39 |
делаем экземпляр класса, он выполняет какую-то задачу, затем я хочу его убрать из памяти т.к. он больше не нужен (это может быть полезно при использовании splash скринов, About'ов и тд. ![]() |
Автор: AntonSaburov 25.4.2005, 13:42 |
MyObject=null; System.gc(); |
Автор: batigoal 25.4.2005, 13:54 |
А разве нужен явный вызов сборщика мусора? Он ведь и сам должен периодически чиститься... |
Автор: Cr@$h 25.4.2005, 13:57 |
Да. И его вызывать даже не рекомендуют, это может замедлить раюоты, кроме него никто не знает, когда он запускался. |
Автор: javastic 25.4.2005, 14:08 |
То что сборщик мусора этим занимается это понятно (после завершения! приложения, но не в процессе выполнения), но как быть если было создано много объектов или несколько, но больших? Развивая далее эту тему хотелось бы узнать насколько связана RMS память для мидлета и его общий размер? Это одно пространство или разделённое? Я просто боюсь что при создании большого числа объектов отнимится память для RMS. |
Автор: batigoal 25.4.2005, 14:25 |
Не знаю, как это организуется в j2me, но вроде обычно GC запускается автоматически при нехватке памяти, так что он отработает и в процессе работы приложения. |
Автор: Cr@$h 25.4.2005, 14:27 |
Не уверен, что во ремя приложения не происходит зачистки! |
Автор: javastic 25.4.2005, 14:29 |
Ладненько, спасибо. Будем запущать отладчики. ![]() |
Автор: Stalnoj 14.5.2005, 18:00 |
Вообще в j2me как-то криво иногда память чистится. Порой просто присвоить объекту null бывает недостаточно. Мой совет такой, если этот объект класс, то создать в этом классе метод destroy(), в нем всем объектам класса присвоить нули (включая и строки). А потом вызывать myObject.destroy(); myObject = null; Если этот объект, к примеру, Vector (да еще если это вектор объектов какого-то класса), то я бы рекомендовал вначале занулить все объекты вектора, а потом уже и сам вектор. В общем не ждите, что java все сделает за вас ![]() А вот Sуstem.gc() я бы не рекомендовал использовать. Во всяком случае крайне редко. Ну, например, если у вас какая-нибудь игра, где происходит переход из меню в игровой режим. При этом большое количество ресурсов выгружается и загружается в память. Тогда есть резон один раз! в конце этого процесса вызвать gc(). В процессе же игры этого делать не стоит. Во-первых, это тормозит приложение (видно даже на глаз - игру как бы цепляет). Во-вторых, java сделает это за вас когда будет нужно ![]() ![]() |
Автор: hTonus 10.4.2007, 17:01 | ||||
heap мидлета и RMS память это разные вещи.
|
Автор: javastic 10.4.2007, 18:31 |
hTonus, спасибо! ![]() |
Автор: Sopromat 7.11.2007, 04:34 | ||
Да.. Утечка памяти - это большая проблема и закрывать эту тему не стоит!!! Коллектор кстати по видимому только когда ссылки с объектом очевидно разорваны, либо когда нехватает памяти... в остальных случаях - утечка... Я с этим столкнулся когда писал одну прогу..... На мобиле пользуешься - пользуешься, а потом бац!!! Ошибка !! И вылетает. И это из-за нехватки памяти. Добавлено через 2 минуты и 56 секунд Кстати вот Вам пример.... Что будет происходить с памятью?
|
Автор: W0LF 7.11.2007, 12:06 | ||
Первая строка выделяет память под объект, ссылка указывает на него. Потом вызывается его метод, если этот метод не переприсваивает эту память другой ссылке? то последняя трока выделяет новую память и теперь ссылка O указывает на нее, то что было выделено ранее остается в памяти, на него нет ссылок, когда будет нехватать памяти, пройдется GC и удалит ее Добавлено через 2 минуты и 43 секунды
|