2010-06-21 29 views
6

Cuốn sách Learning jQuery nói IE có rò rỉ bộ nhớ cho đối tượng DOM có một tài sản tham khảo một chức năng, và các chức năng cũng tham khảo các đối tượng DOM, do đó có một "tham chiếu vòng tròn", như thế này:Trong Internet Explorer, tại sao bộ nhớ bị rò rỉ ở lại, ngay cả khi điều hướng khỏi các trang?

onload = function() { 
    var foo = document.getElementById('foo'); 
    foo.onclick = function() { // DOM object foo's onclick property refers to a function 
     foo.innerHTML = "hello" // the function's body refers to the DOM object 
    }       // therefore circular reference 
} 

IE có thể xử lý các tham chiếu vòng tròn để thu thập rác, nhưng không phải khi tham chiếu vòng tròn liên quan đến cả đối tượng DOM và đối tượng Javascript, bởi vì chúng được xử lý bởi các trình quản lý bộ nhớ khác nhau.

và:

[rò rỉ bộ nhớ ... và] kết quả [tham khảo] vòng lặp không thể được phát hành bởi IE ngay cả khi chúng tôi di chuyển ra khỏi trang.

không bao giờ được giải phóng cho đến khi trình duyệt bị đóng.

Có đúng không? Tại sao IE không giải phóng bộ nhớ đó ngay cả khi người dùng rời khỏi trang? Có phải vì người dùng có thể nhấp vào Back và quay lại trang và IE có muốn giữ trạng thái của trang không? Trong trường hợp đó, điều gì xảy ra nếu người dùng ở trên trang rò rỉ bộ nhớ, sau đó nhấp vào Back và sau đó chuyển đến google.com? Sau đó, trang không thể xem được bởi bất kỳ Back hoặc Forward nào và sự cố rò rỉ bộ nhớ có thể biến mất mà không đóng trình duyệt?

Hoặc ngay cả khi tab được đóng, mà không đóng trình duyệt?

Loại rò rỉ bộ nhớ này có xảy ra trong IE 8 không?

+0

Nhiều chương trình có vấn đề với rò rỉ bộ nhớ; và trong khi nhiều rò rỉ bộ nhớ đã được cắm trong các phiên bản IE mới hơn, thật khó để cắm tất cả chúng vào một dự án có kích thước này. – Piskvor

Trả lời

3

Rò rỉ bộ nhớ là một loại lỗi chương trình, do đó, về cơ bản bạn đang hỏi "tại sao lỗi IE?". Câu trả lời cho điều đó là, rõ ràng, "bởi vì một lập trình viên, một nơi nào đó, đã phạm sai lầm".

Trong khi một số trình duyệt cố ý giữ trạng thái trang ngay cả khi bạn điều hướng khỏi nó (đặc biệt là Opera và FF), "rò rỉ bộ nhớ" nghĩa là bộ nhớ mà chương trình không sử dụng nữa, nhưng quên phát hành. Trong trường hợp này, IE đã ngừng quan tâm đến phần bộ nhớ đó, nhưng không nói điều này với hệ điều hành (Windows), mà vẫn thấy nó là "được sử dụng bởi IE". Vì vậy, phần này của bộ nhớ treo trong đất của một người không, cho đến khi trình duyệt đóng - bởi vì khi quá trình trình duyệt thoát ra, hệ điều hành đánh dấu tất cả bộ nhớ được cấp phát cho quá trình đó là "miễn phí".

Rò rỉ bộ nhớ là một loại lỗi khá ngớ ngẩn, vì chương trình có vẻ hoạt động chính xác nhưng dần dần tiêu thụ nhiều bộ nhớ hơn.

Xem ví dụ: http://en.wikipedia.org/wiki/Circular_referencehttp://en.wikipedia.org/wiki/Garbage_collection_(computer_science) để đọc thêm về chủ đề này.

+0

không những "tham chiếu vòng tròn" có phạm vi "cấp trang" không? Vì vậy, khi trang này bị rò rỉ bộ nhớ và chúng tôi nhấp vào 'Quay lại' và truy cập google.com, trang đó chủ yếu" biến mất "khỏi chuỗi' Quay lại' và 'Chuyển tiếp 'và chúng tôi có thể giải phóng tất cả bộ nhớ liên quan đến trang đó. –

+0

@Jian Lin: Vâng, đó là cách mà * được cho là * hoạt động. Tuy nhiên, một lập trình viên IE có thể quên kiểm tra xem tất cả các tham chiếu trang có được giải phóng chính xác hay không, và vì vậy IE * nghĩ * nó đã dọn dẹp chính xác, nó đã để lại một số dữ liệu trong bộ nhớ và không còn biết về chúng nữa. – Piskvor

+1

@Jian: Sẽ tốt hơn nếu nó hoạt động. Thực tế là vấn đề này vẫn tồn tại mặc dù chỉ ra rằng bộ thu gom rác cho rằng bộ nhớ vẫn được tham chiếu đúng cách (mặc dù có lẽ qua một tuyến không mong muốn) hoặc bộ thu gom rác quá ngu ngốc để đòi lại bộ nhớ, hoặc thậm chí không có bộ thu gom rác . Không thể đánh giá vấn đề là gì nếu không có nguồn tới IE (hoặc giải mã nó, điều này sẽ là thứ hai tốt nhất). –

1

Rò rỉ ở đó vì một trong những lập trình viên của ứng dụng (trong trường hợp này là IE) không xử lý đúng thứ gì đó (đối tượng, tài nguyên) đang sử dụng bộ nhớ.

On MSDN the three commonest causes of leaks in managed applications được coi là:

  • Giữ tham chiếu đến đối tượng quản lý
  • Không để giải phóng các nguồn lực không được quản lý
  • Không vứt bỏ đối tượng Vẽ
Các vấn đề liên quan