утечка памяти в JavaScript - PullRequest
       27

утечка памяти в JavaScript

6 голосов
/ 07 июня 2010

У меня есть некоторый javascript (используемый с API-интерфейсами Google Maps), который я тестирую на IE и Chrome и заметил только признаки утечки памяти в IE: когда я постоянно обновляю страницу, объем используемой в IE памяти продолжает расти (быстро), но в Chrome он остается постоянным.Не публикуя весь код (поскольку он довольно длинный), могу ли я получить некоторые предложения относительно того, на что обращать внимание?Что может привести к тому, что память будет продолжать расти так же, как это происходит в IE при обновлении страницы?

Как я уже сказал, я знаю, что это сложно без кода, но я хотел бы посмотреть, сработает ли сначала какой-либо общий совет.Спасибо.

Обновление : спасибо за ответы до сих пор.В качестве проверки работоспособности я запустил код gip API Google Maps API "Hello World", чтобы увидеть, что произойдет в IE (код показан ниже).При запуске этого кода в IE, когда я продолжаю обновлять страницу снова и снова, память продолжает расти и расти.Это утечка памяти?Это не похоже на предполагаемую функциональность ...

<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }

</script>
</head>
<body onload="initialize()">
  <div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>

Обновление 2 : Так нет ли способа заставить работать этот API-код карты Google Hello World без утечки памяти в IE?Я заметил, что если я проведу тот же эксперимент на maps.google.com , то утечки, похоже, не будет ... Было бы здорово, если бы кто-то мог помочь мне изменить код hello world, чтобы онне течет в IE;таким образом я могу построить его (я не против использовать JQuery, если это поможет, но я попробовал это на коде Hello World, и он все еще просачивался в IE).Еще раз спасибо

Ответы [ 4 ]

7 голосов
/ 07 июня 2010

Обновление:

Я тестировал приведенный выше код с помощью drip.exe , и кажется, что на самом деле что-то вроде утечки памяти. Использование памяти постоянно увеличивалось при выполнении кода с автоматическим обновлением в течение нескольких минут.

Обновление 2:

Я думаю, что это ошибка: http://code.google.com/p/gmaps-api-issues/issues/detail?id=1555&can=1&q=unload&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars

1 голос
/ 07 июня 2010

Вам также необходимо выполнить GUnload перед тем, как покинуть страницу. Просто добавьте событие «unload»:

<body onload="initialize()" onunload="GUnload()">

Подробнее об этой утечке читайте в Google Maps API

1 голос
/ 07 июня 2010

Одним из хорошо известных источников утечек памяти в IE является (преднамеренное или случайное) перехват «содержимого» Javascript в замыканиях (функциях), связанных как обработчики событий с элементами DOM.По этой причине большинство фреймворков стараются явно очистить обработчики событий.

0 голосов
/ 07 июня 2010

Большинство ответов на данный момент помогут вам получить ответ, поэтому я добавляю ссылку на статью о шаблонах утечки памяти в IBM Dev Works for JavaScript (вам может быть полезно)

http://www.ibm.com/developerworks/web/library/wa-memleak/

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