Как исправить эту утечку памяти в window.open IE? - PullRequest
1 голос
/ 19 мая 2010

ОБНОВЛЕНИЕ: Я опубликовал этот вопрос год назад, как ни странно, у меня та же проблема в проекте, над которым я работаю, в основном в IE7. В основном я установил IE7 в WinXP SP3 на виртуальном ПК, и утечки памяти произошли с кодом ниже. В принципе, я не хочу утечек кода с примером кода, который я предоставил ниже, любая помощь будет оценена

Я недавно просматривал этот инструмент для проверки утечки памяти: http://home.orange.nl/jsrosman/

Поэтому я решил протестировать инструмент, создав главную страницу, которая откроет всплывающее окно. Я начал с создания 3 страниц: index.html, page1.html и page2.html, страница index.html откроет дочернее окно (всплывающее окно) со ссылкой на page1.html. Страница1 будет иметь тег привязки, который ссылается на page2.html, а страница2 будет иметь ссылку на страницу page1.html

.

ПРОБЛЕМА

Итак, в инструменте, который я открыл на странице index.html, всплывающее окно открылось до page1.html, затем я щелкнул ссылку page2, утечек пока не обнаружено.

Пока я на странице 2, я щелкаю ссылку обратно на страницу 1, и там инструмент утверждает, что есть ссылка. Утечка, кажется, происходит на странице index.html, и я понятия не имею, почему она это делает. Еще большее беспокойство вызывает то, что я вижу элементы, которые обнаруживает инструмент, которых нет даже на моей странице.

Кто-нибудь имеет опыт работы с этим инструментом или знает, действительно ли это утечка памяти? Есть примеры того, как добиться того, что я делаю, без утечек памяти?

index.html

  <script type="text/javascript">

   MYLEAK = function() { 
    var childWindow = null;

    function showWindow() {
     childWindow = window.open("page1.html", "myWindow");                 
     return false;
    }         
    return {     
     init: function() {
      $("#window-link").bind("click", showWindow);               
     }      
    }       
   }();   

  </script>

 </head>

<body> 
 <a id="window-link" href="#" on>Open Window</a>

 <script type="text/javascript">   
  $(document).ready(function() {
   MYLEAK.init();   
  });
 </script>

</body>
</html>

page1.html

<html>
<body>

 <h1>Page 1</h1>
 <a href="page2.html">Page2</a> 
</body>
</html>

PAGE2.HTML

<html>
<body>
 <h1>Page 2</h1>
 <a href="page1.html">Page1</a> 
</body>
</html>

Цените ваши усилия.

1 Ответ

1 голос
/ 19 мая 2010

Я протестировал эту утечку в Windows 2000 5.00.2195 с пакетом обновлений 4 со следующими спецификациями IE

version: 6.0.2800.1106IS
Chiper Strength : 128-bit
Product ID 55736-837-5565635-04173
Updated Versions:;SP1;Q823353;Q833989

Сохраните ссылку на вновь открытое окно и при его закрытии (или открыть его), установите ссылку на ноль. Таким образом, сборщик мусора будет собирать (в конце концов) объект окна. Если вы этого не сделаете, окно объект остается в памяти, и никто не знает, когда он будет удален.

Кроме того, вы всегда должны называть свои окна (но это не имеет ничего делать с твоей проблемой).

Что-то вроде:

var wPopUp = null;
function clickButton()
{
if ( wPopUp )
{
if ( !wPopUp.closed )
{
wPopUp.close();
}
wPopUp = null;
}

wPopUp = window.open('leak2.html',
'wPopUp', 'width=500, height=400');
}

также посмотрите на MS JS Mem Детектор утечки

Поскольку IE не может выполнять свою работу и восстанавливать циклы, мы должны сделать это. Если мы явно нарушим циклы, то IE сможет восстановить память. По словам Microsoft, замыкания являются причиной утечек памяти. Это, конечно, глубоко неправильно, но это приводит к тому, что Microsoft дает очень плохой совет программистам о том, как справляться с ошибками Microsoft. Оказывается, что легко сломать циклы на стороне DOM. Их практически невозможно сломать на стороне JScript.

Когда мы закончим с элементом, мы должны обнулить все его обработчики событий, чтобы разорвать циклы. Все, что нам нужно сделать, это присвоить нулевое значение каждому свойству обработчика событий. Это может быть сделано очень конкретно, или мы можем сделать общую функцию очистки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...