Я попытался написать код javascript с утечкой памяти, чтобы работать с профилировщиком в Chrome. Однако, похоже, профилировщик не показывает, что должно быть.
Здесь мой код:
<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>
Вы можете видеть, когда я нажимаю кнопку запуска, создается новый объект Leaker. И когда я нажимаю на уничтожение, объект имеет значение null (ПРИМЕЧАНИЕ: но это не будет сбор мусора, поскольку setInterval будет работать).
Проблема. Однако, когда я использую Google Chrome Profiler, он не показывает мне никаких ссылок на мой экземпляр Leaker после того, как я нажму на destroy (но он должен показать мне такую ссылку, поскольку as Я отметил выше, закрытие от setInterval все еще держится на нем).
Профилировщик перед нажатием кнопки уничтожения
Профилировщик после нажатия кнопки уничтожения (вы можете видеть, что я больше не могу найти экземпляр leaker, тогда как он должен быть там).
И вот консоль, setInterval все еще находится в действии, хотя профайлер показывает нам, что больше нет экземпляров Leaker.
Я что-то упустил на пути сбора мусора или профилировщика Chrome?