Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.09.2009, 12:05
Интересующийся
Отправить личное сообщение для NT Man Посмотреть профиль Найти все сообщения от NT Man
 
Регистрация: 09.08.2009
Сообщений: 12

Борьба с утечками памяти (Drip, sIEve и все все все)
Для борьбы с утечками пробую Drip, sIEve. Результаты получаю противоречивые. Кому верить?

Начнем с того, что я понимаю, что и Drip и sIEve используют ядро исключительно установленного в ситеме IE, если не прав поправьте.

Идем далее



это скрин работающего sIEve. inUse это как я понял количевство задейвствованных DOM узлов, колонка leaks это счетчик утечек. Ну и что мы видим? типа все утекло? ну немогу я понять эту картинку, не знаю может этот код прольет свет на глюк в sIEve или мою бесшабашность.

//Создания IFrame для нужного url
function createIFrame(url) {
  var id = 'f' + Math.floor(Math.random() * 99999);
  var div = document.createElement('div');
  document.body.appendChild(div);        
  div.innerHTML = '<iframe style="display:none" src="'+url+'" id="'+id+'" name="'+id+'" onload="sendComplete(this)"></iframe>';
  return document.getElementById(id);
}
// Действия по окончании
function sendComplete(iframe) {
  var doc;
  if(iframe.contentDocument) doc = iframe.contentDocument;
    else if(iframe.contentWindow) doc = iframe.contentWindow.document;
    else if(iframe.document) doc = iframe.document;
  if (doc.location == 'about:blank') return;
  if(ajax_loading_div) ajax_loading_div.style.display = 'none';
  setTimeout(function(){
	  purge2(iframe.parentNode);
//	  iframe.parentNode.parentNode.removeChild(iframe.parentNode)
	  iframe.parentNode.outerHTML = '';
//	  iframe.parentNode = null;
//      iframe = null;
	  },0);
}


Самая соль в этих строчках
//	  iframe.parentNode.parentNode.removeChild(iframe.parentNode)
	  iframe.parentNode.outerHTML = '';


Если раскоментировать iframe.parentNode.parentNode.removeChild и закоментировать iframe.parentNode.outerHTML, то в колонку leaks Ничего не попадет, зато колонка inUse будет после каждого создания/удаления iframe стабильно увеличиваться на 7 элементов.

Идем дальше... Dip-у это безразлично. т.е. кнопочка show DOM Leaks В обоих случаях покажет одинаковый результат. Но там есть другая засада.

Вот пример моей реализации обхода ограничений IE для функции innerHTML

function innerFunctIE (obj, html) {
	//Обход большого глюка IE.
    //http://msdn.microsoft.com/ru-ru/library/ms533897%28en-us,VS.85%29.aspx      
    var ro_tags = {COL:1,  COLGROUP:1,  FRAMESET:1,  HEAD:1,  HTML:1,  STYLE:1,  TABLE:1,  TBODY:1,  TFOOT:1,  THEAD:1,  TITLE:1,  TR:1};
	var insobj = obj;
	purge(obj);
	var old_html = new Date().getTime().toString();
	var NN;
    var CN = document.createTextNode(old_html);
	var i = 0;
    while(obj.tagName in ro_tags){
		//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);
		NN.appendChild(CN);
		CN = NN;
		obj = obj.parentNode;
		i++;
	}
	if (NN) {
		//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);
		NN.appendChild(CN);
//		purge(NN);
		NN.innerHTML = NN.innerHTML.replace(old_html, html);
		for (j = 0; j < i; j++) NN = NN.firstChild;
		var child_node;
		//Все делаем через DOM методы, чтобы не покарежить нежные event-ы
		while (insobj.firstChild) insobj.removeChild(insobj.firstChild);
		for (var i = 0; child_node = NN.childNodes[i]; i) insobj.appendChild(child_node);

//		NN.outerHTML='';
//		NN = null;
//		document.body.appendChild(NN);
	} else obj.innerHTML = html;
}


На этот раз вся соль в строчках
//NN = obj.cloneNode(false);
		NN = document.createElement(obj.tagName);

если делать через NN = obj.cloneNode(false); то при выполнении приложения внутри Drip-а начинаются загадочные глюки в виде того, что последующий NN.appendChild(CN); ничего в итоге не может добавить. В самом IE и в sIEve такой проблемы нет, мне интересно почему так?
Идем дальше а нашел work around и его видно в оригинальном коде, это NN = document.createElement(obj.tagName); да теперь глюк ушел и везде теперь работает, но пока не могу никак избавиться от утечки, если верить Drip, которая получается от создания элементов посредством createElement. Да есть здесь один тонкий момент они не добавляются в DOM, но почему тогда не помогают многочисленные советы найденные по всему интернету, присваивать null объектам созданным посредством createElement?

В общем вопросов очень много, help....

Последний раз редактировалось NT Man, 13.09.2009 в 13:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37