2015-07-28 23 views
14

Tôi đã cố gắng viết mã javascript có rò rỉ bộ nhớ để làm việc với trình thu thập thông tin trong Chrome. Tuy nhiên, có vẻ như profiler không hiển thị những gì nó nên được.Rò rỉ bộ nhớ của trình duyệt Chrome Profiler Javascript

Dưới đây là mã của tôi:

<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> 

Bạn có thể nhìn thấy khi tôi bấm vào nút bắt đầu một leaker đối tượng mới được tạo ra. Và khi tôi nhấp vào hủy, đối tượng được đặt thành rỗng (LƯU Ý: Nhưng nó sẽ không bị thu gom rác vì setInterval sẽ vẫn hoạt động).

Vấn đề: Tuy nhiên, khi tôi sử dụng Google Chrome Profiler, nó không hiển thị cho tôi bất kỳ tham chiếu nào tới dụ Leaker của tôi sau khi tôi nhấp vào hủy (nhưng nó sẽ hiển thị cho tôi tham chiếu như vậy, như tôi đã nói ở trên, đóng cửa từ setInterval vẫn đang giữ nó).

Profiler trước khi nhấp vào nút phá hủy Profiler before clicking on destroy button

Profiler sau khi nhấp vào nút phá hủy (bạn có thể xem phần Tôi không thể tìm thấy leaker dụ nữa, trong khi đó nó sẽ có mặt ở đó).

Profiler after clicking on destroy button

Và đây giao diện điều khiển, các setInterval vẫn còn trong hành động eventhough profiler cho chúng ta thấy không có trường hợp leaker hơn.

Console & setInterval

Am tôi thiếu một cái gì đó trên đường rác thu công trình hoặc các hồ sơ Chrome?

Trả lời

1

Sự khác biệt giữa hai trình thu thập dữ liệu là trước khi bạn "hủy" leak, biến Leaker là toàn cầu và sau đó không phải là biến. Vì vậy, nó chỉ là profiler (và động cơ javascript) mà không hoạt động theo cách bạn mô tả nó. Về cơ bản, bạn có thể thấy các biến toàn cục, nhưng không thể thấy biến cục bộ. Tôi đoán nó có ý nghĩa để phân bổ khác nhau dựa trên phạm vi. Cho đến khi bạn đặt rò rỉ thành null, nó cần phải có sẵn cho các tập lệnh khác.

Bạn có thể thấy với một ví dụ nhỏ như thế nào profiler công trình khác nhau dựa trên phạm vi:

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:

Chỉ cần làm rõ, đối tượng vẫn còn trong profiler, và vẫn được phân bổ, nhưng không giống như cách toàn cầu. Tôi vừa tạo một ví dụ tối thiểu về cách trình duyệt của Chrome hoạt động. Khi một biến là toàn cầu, bạn sẽ thấy nó trong và có thể lọc nó trong bộ lọc lớp, nhưng nếu không bạn không thể.

Hiện tại, nó vẫn ở đâu đó. Bạn có thể kiểm tra trong việc đóng cửa thả xuống, bạn sẽ thấy bạn có một leaker có trên cả hai snapshot:

enter image description here

Có lẽ một bản sao được tạo ra khi trong một đóng cửa, do đó thông tin bối cảnh có thể được phân bổ là tốt.