2014-12-14 3 views
15

Я использую этот простой HTML-файл, чтобы воспроизвести утечку памяти, я нашел:Углеродные утечки памяти?

<!doctype html> 
<html> 
    <head> 
     <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js"></script> 
     <script> 
      var app = angular.module('testApp', []); 

      app.directive('directive1', function() { 
       return { 
        template: '<div directive2></div>', 
        scope: true 
       }; 
      }); 

      app.directive('directive2', function() { 
       function LeakObject() {} 

       function Foo() { 
        this.bar = function($scope) { 
          $scope.nottheredude; 
        }; 
       } 

       return { 
        scope: true, 
        link: function($scope) { 
          $scope.memoryThatLeaks = new LeakObject(); 

          new Foo().bar({}); 
          new Foo().bar($scope); 
        } 
       }; 
      }); 
     </script> 
    </head> 
    <body ng-app="testApp"> 
     <button ng-click="show = !show">Toggle</button> 
     <div ng-if="show">The directive <div directive1></div></div> 
     <div ng-if="!show">Nothing</div> 
    </body> 
</html> 

У меня есть директива, что только создает новую область и имеет другую директиву в своем шаблоне.

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

В моем основном html, я просто переключаю между ничего и directive1 с простым ng-if.

Обратите внимание, что directive2 также создает новый объект на $scope под названием LeakObject. Я ожидаю, что этот объект будет собран из мусора, когда я перейду к div без ничего, так как область действия директивы должна умереть и все данные на ней с ней, но в соответствии с инструментом моментального снимка кучи Chrome в режиме инкогнито, он не получает нераспределенной.

Я пытаюсь понять, почему это происходит, и почему, если я прокомментирую заявление в методе bar, это не произойдет.

Шаги для воспроизведения:

  1. Открыть this file инкогнито
  2. Open Dev инструменты и перейти к профилям
  3. Обновить страницу
  4. Нажмите кнопку Toggle дважды (так что теперь вы снова видите Nothing на экране)
  5. Сделайте снимок кучи
  6. Напишите «утечку» в фильтре, u может видеть, что LeakObject все еще существует, когда он не должен действительно существовать.

Вот как это должно выглядеть следующим образом:

The problem

Может кто-то пожалуйста, помогите/объяснить?

+0

Видимо, это не является проблемой в Windows 8, Chrome 42 – Trevor

+0

Не удается воспроизвести проблему на Ubuntu15/темэ – Bolza

ответ

1

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

вы можете добавить следующий код в функции связи, чтобы увидеть, что директива на самом деле получает уничтожить

контроллера и директивы испускают событие прямо, прежде чем они будут уничтожены. Здесь вам предоставляется возможность снести ваши плагины и слушателей и в значительной степени выполнять сборку мусора. Подписаться на $ рамки. $ На ('$ уничтожить', ...) событие

$scope.$on('$destroy',function(){ 
    //$scope.memoryThatLeaks = null; 
    alert('!'); 
}); 
+0

Итак, вы говорите, что не можете воспроизвести проблему, возможно, это проблема с ОС/браузером. Я, работающий на Chrome 39.0.2171.71 на OSX Yosemite, также случается с другими разработчиками, с которыми я разговаривал. Я знаю, что директива уничтожается, поэтому она кажется утечкой памяти. – Barnash

+5

Тот факт, что функция, переданная в '$ on ('$ destroy'', выполняется, на самом деле не доказывает, что директива получает« разрушение », и что утечка памяти отсутствует. Не говоря уже о утечке памяти, хотя , не заглядывали в него сами. – tasseKATT

+0

вы правы, тот факт, что событие «$ destroy» запущено, доказывает, что поток Angular работает должным образом, директива и ее область должны быть удалены. – Moran

Смежные вопросы