Это - то, как у меня есть вещи установка:
Вот образец массива (сокращен от 6 000 + строки к 2):
var database1=[[
"2010-01-03 07:45","2010-01-03 11:00","534","A","","","","","Installed washing machine","0","1","1","Indeed","",""],[
"2010-03-20 15:00","2010-03-20 16:00","571","F","","","","","Installed oven","0","5","1","Indeed","",""],[
etc,etc,etc...]];
Когда я добавляю database1.js голове на контейнере, память, используемая для IE в окнах, спрыгивает с 7,7 МБ к 21,9 МБ. Это прекрасно, я могу теперь циклично выполниться, хотя массив назвал database1 (первая строка, и столбец в database1[0][0]).
Проблема состоит в том, что я должен повторно добавлять файл базы данных время от времени и при этом увеличения использования памяти (я думал, что массив базы данных будет перезаписан).
Таким образом, первые повторно добавляют использование памяти нажатий в IE до 30,4 МБ, но затем продолжает увеличиваться на каждом, повторно добавьте: 30,4 МБ> 33,9 МБ> 39,5 МБ> 42,1 МБ и т.д.
Для предотвращения этого, я теперь очищаю каждый объект в массиве, прежде чем я повторно добавлю database1 файл.
for ( var i=0, il=database1.length; i<il; i++ ){
delete database1[i];
}
//append database1.js to head code here
Это действительно помогает. Использование памяти не уменьшается до начальных 7,7 МБ, но действительно однако уменьшается с 21,9 МБ до 14,1 МБ. Следующие повторно добавляют, увеличивает память до 25,9 МБ (очищающийся с циклом: 18,8 МБ). Следующие повторно добавляют, увеличивает память до 29,3 МБ (очищающийся с циклом: 24,5 МБ).
Я рад, что использование памяти не поднимается как быстро, но возможно это может быть оптимизировано далее? К сожалению, перезагрузка страницы HTML не является опцией.
Управлять памятью в JavaScript помогает сборщик мусора - функция языка, которая периодически удаляет ненужную память.
Оператор delete
по сути обозначает область памяти как более не нужную. Память будет деаллоцирована при следующем запуске сборщика мусора.
Сборка мусора не предсказуема - delete $var
или $var = null
позволит сборщику мусора деаллоцировать память со временем. Это может быть не мгновенно. Вот почему использование памяти растет не так быстро, как вы ожидаете, и вот почему delete $var
не уменьшает использование памяти так быстро, как вы ожидаете.
В IE есть средство принудительного запуска сборщика мусора:
if (typeof(CollectGarbage) == "function") {
CollectGarbage();
}
Ваш скрипт может замедлиться, пока это происходит, особенно если нужно деаллоцировать большой объем памяти.
Лучше избегать принудительной сборки мусора - позвольте сборщику мусора запускаться в тот момент, который он считает наиболее подходящим. CollectGarbage()
также не документирована - поведение может измениться или функция может быть удалена в любой момент.
Короче говоря:
delete database1[i]
- лучшее, что вы можете сделать