![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Vitaly333 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: 2 Всего: 2 |
У меня тоже возникли не которые проблемы с очисткой памяти.
Есть алгоритм который использует структуру данных - массив указателей на строки (зубчатый двумерный массив A). Алгоритм работает с большими объемами данных. Во время работы алгоритма некторые элементы массива становятся не нужными и поэтому я их периодически очищаю (5 раз в ходе самого алгоритма запускаю процедуру очистки). Как я это делаю: Прохожу по уже обработаным строкам зубчатого массива (Цикл J = 0,...,i-1) и собираю только нужные элементы во временный массив (TempRow). Для каждой строки свой временный массив TempRow, размер которого (size) естественно меньше размера соответствующей строки зубчатого массива (A.data[j].length). Далее перекидываю ссылку в зубчатом массиве со старой строки на этот новый временный массив вызовом функции A.SetData(j,TempRow.getArray()). Т.е память, которая отводилась под старую строку должна быть по идеи освобождена. Далее удаляю ссылки на TempRow чтобы при следующем вызове процедуры очистки старые строки удалялись. После всего этого принудительно вызываю сборщик мусора. Но при последующих вызовах процедуры очистки память не освобождается а только растет и растет. Ссылок на new ModDoubleArrayList(size) кроме TempRow и ссылки в массиве указателей на строки больше нигде в алгоритме нету. Вот кусок кода, взятого из алгоритма, который выполняет очистку:
Код массива указателей на строки, здесь я привел только необходимые функции:
Вот код для TempRow:
|
||||||
|
|||||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
В многопоточном приложении, на мой взгляд, есть нюанс. Если обьект стал ненужным, но есть вероятность, что другой поток все еще копается в этом обьекте, то чистить его (обнулять внутренние ссылки) никак нельзя. Только ссылку на сам обьект обнулить можно. Или синхронизацию вводить. Я по этой причине перестал помогать gc. Просто выбрасываю. Это сообщение отредактировал(а) COVD - 29.5.2008, 15:27 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |