| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 секунды
|