Используя JavaScript с Internet Explorer, как очистить память без обновления страницы? - PullRequest
1 голос
/ 01 сентября 2009

У меня есть веб-сайт на основе AJAX с использованием JavaScript на клиенте. Определенные операции на сайте кэшируют большие результирующие наборы от вызовов службы в браузере (то есть сотни мегабайт). Это одноразовые результаты. Они будут просмотрены в течение короткого времени, а затем должны быть удалены из памяти.

Я написал небольшой тестовый сайт, который загружает кучу мусора в память и затем вызывает метод JavaScript delete. Это прекрасно работает в Firefox (память почти мгновенно возвращается). Internet Explorer 8 (еще не пробовал 7) не освобождает память до тех пор, пока страница не будет обновлена ​​или закрыта.

Кто-нибудь знает, как отказаться от использования памяти IE с помощью JavaScript / Ajax (без обновления страницы)?

Ниже приведен мой пример кода клиента:

function load() {
 var x = ['dfjasdlfkjsa;dflkjsad;flkjsadf;lj'];

 for( var i = 0; i < 10000000; ++i ) {
  x.push('asdfasfasfsfasdfkasjfslafkjslfjsalfjsaldfkjasl;dfkjsadfl;kjsdflskajflskfjslakfjaslfkjsaldfkjsaldfksdfjk');
 }

 alert('deleting');   // <--- memory usage around 500mb
 delete x;            // <--- immediate results in Firefox 3.5 (not IE8)
 alert('done');
}

ОБНОВЛЕНИЕ: Установка переменной 'null' не приводит к немедленной очистке памяти (поскольку она остается до сборщика мусора). Кроме того, установка переменной null дает только одну ссылку, где может быть несколько ссылок.

Ответы [ 5 ]

1 голос
/ 02 сентября 2009

IE (ну, технически, JScript) имеет недокументированный CollectGarbage метод , который предположительно заставляет сборщик мусора запускаться немедленно . Возможно, вы захотите поиграть с этим, но по моему опыту, null упоминаний достаточно в большинстве случаев.

1 голос
/ 01 сентября 2009

Я понимаю, что вы упомянули, что данные выбрасываются, но когда вы удаляете узлы, даже если просто установите для x значение null, вы должны убедиться, что ни один из узлов не подключен к обработчикам событий, иначе этот узел не сможет быть мусором.

Вот функция, которую я использую в своем собственном коде: http://javascript.crockford.com/memory/leak.html

1 голос
/ 01 сентября 2009

И если вы попробуете "x = null;" вместо удаления?

1 голос
/ 01 сентября 2009

Просто присвойте ноль переменной:

x = null;
1 голос
/ 01 сентября 2009

Вместо использования метода удаления установите переменную на null. Это, кажется, лучший способ очистить кросс-браузерную память (delete общеизвестно ненадежен). Он работает так же, как мой другой ответ здесь .

alert('deleting');   // <--- memory usage around 500mb
x = null;
alert('done');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...