Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Как корректно удалить объект из памяти?


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

Автор: 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
Ладненько, спасибо. Будем запущать отладчики.
smile

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

myObject.destroy();
myObject = null;

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

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

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

Автор: hTonus 10.4.2007, 17:01
Цитата(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 ) {}



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

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

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

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

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

Код

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




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

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

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

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