2015-07-28 5 views
14

Я попытался написать код javascript с утечкой памяти, чтобы работать с профилировщиком в Chrome. Однако, похоже, профилировщик не показывает, что это должно быть.Хром Профайлер Утечка памяти Javascript

Вот мой код:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

<button id="start_button">Start</button> 
<button id="destroy_button">Destroy</button> 

<script type="text/javascript" charset="utf-8"> 
var Leaker = function(){}; 

Leaker.prototype = { 
       init:function(){ 
         this._interval = null; 
         this.start(); 
       }, 
       start: function(){ 
         var self = this; 
         this._interval = setInterval(function(){ self.onInterval(); }, 100); 
       }, 
       onInterval: function(){ console.log("Interval"); } 
}; 

$("#start_button").click(function(){ 
     if(leak !== null && leak !== undefined){ 
      return; 
     } 

     leak = new Leaker(); 
     leak.init(); 

}); 

$("#destroy_button").click(function(){ 
     leak = null; 
}); 

var leak; 

</script> 

Вы можете видеть, когда я нажимаю на кнопку запуска нового объекта тека создается. И когда я нажимаю на уничтожение, объект имеет значение null (ПРИМЕЧАНИЕ: Но это не будет сбор мусора, поскольку setInterval будет работать).

Задача: Однако, когда я использую Google Chrome Profiler, он не показывает мне ссылки на мой экземпляр Leaker после того, как я нажму на уничтожение (но он должен показать мне такую ​​ссылку, поскольку, как я отметил выше, закрытие от setInterval все еще держится на нем).

Profiler, прежде чем нажать на кнопку уничтожить Profiler before clicking on destroy button

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

Profiler after clicking on destroy button

А вот консоль, setInterval по-прежнему в действии Eventhough профайлер показывает нам нет больше случаев протечек.

Console & setInterval

я упускаю что-то по дороге мусор собирает работу или профилировщику Chrome?

ответ

1

Разница между двумя профайлерами заключается в том, что перед тем, как «уничтожить» leak, переменная Ликера является глобальной и после нее нет. Так что это просто профайлер (и движок javascript), который не работает так, как вы его описываете. В основном вы можете видеть глобальные переменные, но не локально ограниченные переменные. Я предполагаю, что имеет смысл распределять по-разному на основе области. Пока вы не установили утечку в значение null, она должна быть доступна для других скриптов.

Вы можете видеть, с минимальным, например, как профайлер работает по-разному на основе объема:

var Leaker = function() {}; 
 

 
var Leaker2 = function() {}; 
 

 
// this one is going to be in the profiler 
 
var leak = new Leaker(); 
 

 
(function(){ 
 
    // this one is not in the profiler 
 
    var leak2 = new Leaker2(); 
 
    setInterval(function(){console.log(leak2)}, 500); 
 
})()

EDIT:

Просто чтобы прояснить, объект все еще находится в профилировщик и все еще выделяется, но не так, как глобальный. Я просто создал минимальный пример того, как работает профайлер Chrome. Когда переменная является глобальной, вы увидите ее и можете фильтровать в фильтрах классов, но если нет, вы не можете.

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

enter image description here

Может быть дубликат создается, когда в затворе, так что информация контекста может быть выделена, а также.

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