Как выявить, исправить, устранить утечку памяти в гаджете Windows Sidebar? - PullRequest
2 голосов
/ 02 августа 2009

Я написал гаджет для боковой панели Windows. По сути, это означает, что это миниатюрная веб-страница, которая работает месяцами подряд.

Через несколько недель использование памяти (рабочий набор) процесса sidebar.exe, в котором размещаются гаджеты сторонних производителей, достигает сотен мегабайт.

Без способа определить источник утечек памяти, я просто предполагаю, что это, по слухам, проблема закрытия XMLHttpRequest. Хотя в моем случае я делаю это не асинхронно. Так что я думаю, это просто JAX , а не A JAX.

Функция javascript с использованием веб-хита:

function FetchXML(method, url)
{
   var xmlHttp;
   try
   {
      // Firefox, Opera 8.0+, Safari  
      xmlHttp=new XMLHttpRequest();  
   }
   catch (e)
   {  // Internet Explorer  
      try
      {
         xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");    
      }
      catch (e)
       {
         try
         {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");      
         }
         catch (e)
         {
            throw "XMLHttp not supported"
         }
      }
   }

   xmlHttp.open(method, url, false);
   xmlHttp.send(null);  
   if (xmlHttp.status != 200)
   {
      throw "Server returned status code "+xmlHttp.status.toString();
   }

   if (xmlHttp.responseXML.parseError.errorCode != 0)
   {
      throw "Error in returned XML: "+xmlHttp.responseXML.parseError.reason;
   }

   var responseXML = xmlHttp.responseXML;
   xmlHttp = null;
   return responseXML;
}

Выглядит ли это так, как будто это может быть причиной утечки памяти?


Я боюсь, что без фактического закрытия я вернусь к исходной точке.

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

Кроме того, объекты DOM и объекты JavaScript находятся в разных пространствах памяти, поэтому, если у вас есть циклические ссылки, такие как

  table = [];
  table[0] = document.getElementById('myDiv');
  table[0].ownerTable = table;

тогда ни массив, ни div никогда не будут собирать мусор, даже если все другие ссылки на два объекта вышли из области видимости.

1 голос
/ 18 сентября 2011

Ваш вопрос слишком стар, чтобы быть затронутым этим, но для тех, кто случайно столкнется с ним позже ...

В Windows 7 64bit SP1 появилась утечка памяти sidebar.exe (и некоторые люди сообщают, что подобные проблемы возникали в Vista). Предложенный обходной путь в этом сообщении в блоге работал для меня.

1 голос
/ 16 октября 2009

Это немного поздний ответ, но я заметил, что он остался без ответа. Глядя на ваш код, вы работаете синхронно, и там нет циклических ссылок. Я сомневаюсь, что это является источником утечки памяти, и это, вероятно, будет где-то еще в вашем коде. Ранее я сталкивался с утечками памяти в гаджетах рабочего стола Windows, и самый большой из них я обнаружил при динамическом добавлении тегов сценария в документ (например, при использовании методов обратного вызова JSON из веб-службы).

Между прочим, проверяемые браузером проверки почти полностью избыточны. IE7, самая низкая версия IE, допустимая в Vista, представила объект XMLHttpRequest () (хотя он может быть отключен пользователем или системным администратором). Я бы порекомендовал просто заменить его следующей строкой:

xmlHttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

<ч /> Два года спустя я получил здесь голосование и заново открыл вопрос, и ответ сразу же пришел ко мне. Я вспомнил, что видел следующее предупреждение в учебнике по MDN для XMLHttpRequest:

Примечание: Вы не должны использовать синхронные запросы XMLHttpRequest, потому что из-за асинхронного характера работы сети существуют различные способы утечки памяти и событий при использовании синхронных запросов.

Я немного изо всех сил пытаюсь выяснить, правда ли это или просто добавлено каким-то случайным человеком, чтобы помочь распространению страха (в конце концов, это вики), но, возможно, это и объясняет утечку вашей памяти.

...