Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как освободить память из под объекта внутри функции. / 11 сообщений из 11, страница 1 из 1
30.03.2012, 11:42:38
    #37731063
justcoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
Представьте себе такую ситуацию, есть функция

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public void f(){
 Map map=new HashMap<String,String>();
 while (условие){
 //Наполняю мапу
  if (условие){
    //вот тут у меня размер мапы очень большой и данные котрые в ней -я проработал они мне не нужны, но
    //Сама мапа нужна. Я хочу освободить ресурсы и пишу
    map=new HashMap<String,String>();
  }
 else{
   //Наполняю мапу
 }
 }
}



Собственно корректно ли я освобождаю память из-под мапы или нужно так:
Код: java
1.
2.
map=null;
map=new HashMap<String,String>();



В общем как корректно будет?
...
Рейтинг: 0 / 0
30.03.2012, 11:49:26
    #37731072
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
можно спокойно и без null обойтись
...
Рейтинг: 0 / 0
30.03.2012, 11:52:54
    #37731084
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
Забыл что тут редактировать сообщения нельзя :)
Когда вы делаете
Код: java
1.
map=new HashMap<String,String>();

, если вы больше ни не наплодили ссылок на этот HashMap, то на объект(старый HashMap) больше ничто не указывает и GC может спокойно его "стырить".
...
Рейтинг: 0 / 0
30.03.2012, 12:55:37
    #37731231
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
Код: java
1.
2.
3.
if (условие) {
  map.clear();
}
...
Рейтинг: 0 / 0
30.03.2012, 13:50:48
    #37731339
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
grasoff.net,

читал что это просто очистит мапу, но никак не освободит память!?
т.е. если там было стотыщмильёнов элементов, они так там и будут там но будут null
вот так делает HashMap
Код: java
1.
2.
3.
4.
5.
6.
7.
public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
}


если там было 1кк записей то получается лишняя трата времени на проход по Entry и их null'ение.
быстрее просто "похерить" ссылку

или я ошибаюсь? не силён в теории :(
...
Рейтинг: 0 / 0
30.03.2012, 14:00:22
    #37731369
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
DDiverили я ошибаюсь? не силён в теории :(
Не ошибаетесь. Проще создать новый HashMap.
...
Рейтинг: 0 / 0
30.03.2012, 14:00:47
    #37731373
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
BlazkowiczDDiverили я ошибаюсь? не силён в теории :(
Не ошибаетесь. Проще создать новый HashMap.
И быстрее во всех отношениях.
...
Рейтинг: 0 / 0
30.03.2012, 14:04:50
    #37731385
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
DDiver,

GC будет смотреть не только на то, есть ли ссылки на map, но и есть ли ссылки на его элементы и, соответственно память освобождается по-элементно. Т.е. трудно, не зная подробностей работы GC, определить какой метод эффективней
...
Рейтинг: 0 / 0
30.03.2012, 14:09:57
    #37731401
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
DDiverесли там было 1кк записей то получается лишняя трата времени на проход по Entry и их null'ениетак-то это копейки. даже не копейки )

а вот new HashMap() создаст новый объект, при добавлении в который будут вызываться более тяжелые операции по увеличиванию внутреннего массива
...
Рейтинг: 0 / 0
30.03.2012, 14:20:30
    #37731427
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
Valery ShiskinDDiver,

GC будет смотреть не только на то, есть ли ссылки на map, но и есть ли ссылки на его элементы и, соответственно память освобождается по-элементно. Т.е. трудно, не зная подробностей работы GC, определить какой метод эффективней
Это не совсем там. Современные GC сканируют только живые объекты. Всё остальное прибивается охапкой. Поэтому на производительность GC чаще влияет количество живых объектов, а не количество удаляемых.
...
Рейтинг: 0 / 0
30.03.2012, 14:24:43
    #37731441
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как освободить память из под объекта внутри функции.
grasoff.netа вот new HashMap() создаст новый объект, при добавлении в который будут вызываться более тяжелые операции по увеличиванию внутреннего массива
Так это отдельный разговор.
public HashMap(int initialCapacity, float loadFactor)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как освободить память из под объекта внутри функции. / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]