Немного о Vector и ByteArray
Как всегда, буду краток.
const someVector:Vector.<SomeT> = new <SomeT>[]; ... добавляем объекты SomeT в someVector someVector.length = 0; // ! освобождения памяти не происходит ! // Память может только расти. Освободить память можно лишь someVector = null;
ByteArray освобождает память только по clear(), установка его length = 0 не освобождает память.
UPD
Вот листинг программы теста вектора. Собиралось AIR SDK 4.0.0.1628 c -advanced-telemetry. Упаковывалось под iOS, тестировалось на iPhone 4S.
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.system.System; import flash.ui.Multitouch; import flash.ui.MultitouchInputMode; [SWF(width="960", height="640", frameRate="60", backgroundColor="#005686")] public class VectorMemoryAllocationTest extends Sprite { //------------------------------------------------------------------------- // // Constructor // //------------------------------------------------------------------------- /** * Constructor */ public function VectorMemoryAllocationTest() { super(); this._taps = 0; Multitouch.inputMode = MultitouchInputMode.NONE; super.stage.frameRate = 10; super.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.handler_interaction); } private var _taps: int; private var _vector: Vector.<uint>; private function handler_interaction(event:Event):void { switch (this._taps) { case 0: trace('Create vector'); this._vector = new <uint>[]; System.gc(); break; case 1: trace('Set vector length'); this._vector.length = 1024 * 1024; break; case 2: trace('Splice vector'); this._vector.splice(0, this._vector.length); break; case 3: trace('gc()'); System.gc(); break; case 4: trace('Null vector'); this._vector = null; break; default: this._taps = -1; } this._taps++; } } }
Вот сам лог
Всего комментариев 44
Комментарии
29.03.2014 02:57 | |
И о чем это говорит? Что Vector хоть и упакованный массив, но не массив?
|
29.03.2014 21:39 | |
Для верности, думаю, стоит дополнить информацией по такому кейсу:
- создаем ByteArray длиной N - наполняем его - ставим длину на 0 - ставим длину на M - снова наполняем его |
30.03.2014 13:12 | |
Цитата:
установка его length = 0 не освобождает память
|
30.03.2014 19:11 | |
а хип то по-моему должен как раз увеличиваться
|
31.03.2014 12:35 | |
Имхо length вообще должна быть read only. Ибо путаница и разброд в умах.
|
31.03.2014 13:59 | |
Разброда нет - есть желание повторно использовать область памяти.
|
31.03.2014 14:06 | |
Используйте, что мешает? Только длину не трогайте.
|
31.03.2014 15:07 | |
Я всего лишь выражаю сомнение в том факте, что принудительное указание length безусловно сохраняет текущее распределение памяти как есть. Из чисто логических соображений, это не так. Т.е. откручивание/прикручивание таки происходит . А стало быть, практически данная операция несет в себе больше вопросов "что на самом деле происходит", чем увернности "да, все происходит именно так, как я думаю должно происходить". Программисту тут далеко не все доверяется, увы (ура, нужное подчеркнуть).
Потом, что ты так цепляешься: "вот в одном месте установили length, все сразу будут знать, до какого байта читать". length read only не исключает же, что все будут ее знать, не? |
|
Обновил(-а) alexcon314 31.03.2014 в 15:20
|
31.03.2014 16:19 | |
Цитата:
length read only не исключает же, что все будут ее знать, не?
|
31.03.2014 16:37 | |
splice-то хоть работает?
|
31.03.2014 17:03 | |
Кстати, да.
Цитата:
splice - Этот метод изменяет массив, не создавая копии.
|
01.04.2014 12:22 | |
Цитата:
splice-то хоть работает?
|
02.04.2014 11:47 | |
Вроде как, splice() должен выделять память под удаляемые элементы, не? Если удалять все, то даш на даш выходит.
|
02.04.2014 15:00 | |
Зайду с другого краю. Как очистить память, занимаемую элементами вектора и более не нужными, не разрушая его?
|
02.04.2014 17:09 | |
Сколько памяти занимает один элемент вектора и как ее занулить?
|
02.04.2014 21:34 | |
Почему бы просто не занулять элементы (=null)? uint, int обнулится (=0), а ссылочный тип соберется gc, при этом элемент-ссылка в векторе останется на месте, только за-null'енная. Этого ты добиваешься? Вот только память из под вектора так не высвободишь, нули тоже место занимают, но ведь уже не о том речь?
|
|
Обновил(-а) alexcon314 02.04.2014 в 21:56
|
02.04.2014 21:49 | |
Я бы так и сделал перед переустановкой длины, но не факт, что сработает.
|
03.04.2014 01:41 | |
Мне интересно.
|
03.04.2014 08:54 | |
Интересное чтиво (про векторы и массивы).
|
03.04.2014 15:46 | |
Цитата:
Мне интересно.
|
03.04.2014 18:29 | |
Интересное чтиво (про векторы и массивы и хеши)
|
03.04.2014 23:00 | |
В общем, если увидите в коде vector.length = 0, то знайте, что автор не читал чтиво.
|
03.04.2014 23:12 | |
dimarik, ну и резюме твоё? Нужно пересоздавать новый вектор? Я видел такие советы в интернете.
|
04.04.2014 10:40 | |
С этим может быть проблема, если кто-то хранит прямую ссылку на этот вектор. И это, в общем-то, нормально.
|
23.04.2014 12:39 | |
Нормально - в смысле, занулять вектор, как делает господин jpauclair.
|
25.04.2014 19:43 | |
А что с Array? Тоже самое или такой проблемы нет?
|
26.04.2014 00:13 | |
Дилемма "длина"-"размер" продолжает будоражить умы?
Судя по первой части чтива, в основе Array сидит, тот же dense array, что и в векторе. Почему там что-то должно быть иначе? Управлять памятью "а-ля Си", ну никак... Кстати, о пулах.. Было бы неплохо делать массивы с размером, кратным 4К , тем более, что меньше он все равно быть не может. Инициализировать до кучи и использовать по полной. И забыть про то, что length is read-write после инициализации. Тогда есть неплохой шанс сильно облегчить работу менеджеру памяти в плане очистки-выделения хотя бы. Видимо, все идет к тому, чтобы написать свой менеджер памяти . Оффтопом вспомнилось, был у меня трейсер-дампер простенький запилен для проектора, воочию убедился в том, что при указании длины ByteArray он физически помещается в другой блок памяти, старый остается не у дел (при length=0 точно, на других значениях не помню, но все шансы за то). Воочию же видел, что new ByteArray() выделяет сразу блок 4096 байт памяти, не всегда чистой, кстати, блуд в идиотизмах писал. UPD. Написал 4К для винды, как там в мобилах не скажу точно.. |
|
Обновил(-а) alexcon314 26.04.2014 в 00:31
|
26.04.2014 00:19 | |
dimarik - гляжу тоже пишешь с this переменные. Или всегда так писал? А вот Wolsh нервничает от этого, и вроде не только он
|
27.04.2014 13:16 | |
Если раз и навсегда привыкнуть к this, легче потом переходить на JavaScript
|
29.04.2014 10:50 | |
Цитата:
А что с Array? Тоже самое или такой проблемы нет?
|
29.04.2014 11:22 | |
Цитата:
Подтверждаю, с Array такой проблемы нет. Можно через указание его длины управлять памятью.
|
29.04.2014 22:29 | |
Уже переписал.
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)