2009-07-03 21 views
8

Tôi đã đọc để cố gắng hiểu rõ các rò rỉ bộ nhớ trong các trình duyệt, đặc biệt là. I E. Tôi hiểu rằng các rò rỉ được gây ra bởi sự không phù hợp trong các thuật toán thu gom rác giữa công cụ Javascript và cây đối tượng DOM, và sẽ vẫn tồn tại trong quá khứ. Những gì tôi không hiểu là lý do tại sao (theo một số báo cáo trong các bài báo tôi đọc) bộ nhớ không được khai hoang sau khi trang được tải xuống bởi trình duyệt. Điều hướng khỏi trang web nên đặt tất cả đối tượng DOM và javascript nằm ngoài phạm vi tại thời điểm đó, phải không?Rò rỉ bộ nhớ Javascript sau khi tải xuống một trang web

+0

chính xác lý do tại sao chúng bị rò rỉ :) Không thể khôi phục bộ nhớ. –

Trả lời

8

Đây là vấn đề. IE có một bộ thu gom rác riêng cho DOM và cho javascript. Họ không thể phát hiện các tham chiếu vòng tròn giữa hai người.

Những gì chúng tôi sử dụng để xóa tất cả các trình xử lý sự kiện từ tất cả các nút khi tải trang. Điều này có thể, tuy nhiên, ngăn chặn trình duyệt trong khi dỡ hàng. Điều này chỉ giải quyết trường hợp tham chiếu vòng tròn do bộ điều khiển sự kiện gây ra. Nó cũng có thể được gây ra bằng cách thêm các tham chiếu trực tiếp từ các nút DOM vào các đối tượng js có tham chiếu đến nút DOM chính nó.

Một điều tốt cần nhớ là nếu bạn đang xóa các nút, bạn nên tự loại bỏ các trình xử lý trước. Ext-js có một phương thức Ext.destroy thực hiện điều đó (nếu bạn đã thiết lập các trình xử lý bằng ext).

Ví dụ

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property 
function El(node) { 
    this.dom = node; 
    node.el = this; 
} 

Sau đó, Microsoft bị hack IE nên nó loại bỏ tất cả các xử lý sự kiện và tài sản expando khi dỡ nội bộ, do đó nó là nhanh hơn nhiều so với làm việc đó với js. Sửa chữa này dường như để sửa chữa vấn đề bộ nhớ của chúng tôi, nhưng không phải tất cả các vấn đề như có những người vẫn còn có vấn đề.

MS's description of the problem

MS releases patch that "fixes" memory leaks:

Blog about fixed memory leaks

IE still has some problems

Tại công ty chúng tôi, chúng tôi sử dụng ext-js. Bằng cách luôn đặt các trình xử lý sự kiện bằng cách sử dụng các ext-j, có một thói quen dọn sạch nội bộ, chúng tôi chưa từng bị rò rỉ bộ nhớ. Trong thực tế, việc sử dụng bộ nhớ tăng lên nhưng dừng lại ở mức 250Mb cho một máy có 4Gb RAM. Chúng tôi không nghĩ rằng đó là quá xấu vì chúng tôi tải khoảng 2Mb (không nén) các tệp js và tất cả các yếu tố trên trang đều động.

Có rất nhiều điều để nói về điều này và chúng tôi đã nghiên cứu rộng rãi ở nơi tôi làm việc. Vui lòng đặt câu hỏi cụ thể hơn. Tôi có thể giúp được bạn.

+0

Cảm ơn bạn đã nghiên cứu, IE9 có cải thiện gì không? Chúng tôi đang gặp phải rò rỉ chỉ bằng cách thiết lập thuộc tính innerHTML, các máy khách đang chạy trên VMWARE và bộ nhớ bị rò rỉ nhanh. Yêu cầu người dùng mạng nội bộ mở lại ứng dụng không phải là giải pháp, nhưng chúng tôi không có lựa chọn nào khác. –

+1

@AlexanderN Nếu bạn đang gặp phải sự tăng trưởng bộ nhớ khi đặt 'innerHTML', rất có khả năng bạn đang tạo rò rỉ bằng cách xóa các nút khỏi DOM mà không cần tháo các trình xử lý được gắn vào chúng. Bạn không nên ghi đè 'innerHTML' mà không xóa bất kỳ trình xử lý nào trước. Điều đó xảy ra với bất kỳ trình duyệt nào. –

3

Điều tốt nhất tôi từng đọc về Javascript memory leaks được viết bởi Doulgas Crockford.

Để trả lời câu hỏi của bạn, có, trình duyệt hoàn toàn nên dỡ tất cả các đối tượng (và quan trọng nhất là xử lý sự kiện) vào thời điểm thích hợp. Nếu nó đã làm, nó sẽ không có rò rỉ :)

0

Bạn không cần phải làm cho tinh thần của họ - họ là lỗi trong broswers và được cố định từ phiên bản cho các phiên bản.

+0

Chỉ vì một phiên bản được sửa không loại trừ lỗi; các phiên bản cũ hơn của trình duyệt sẽ vẫn được sử dụng trừ khi bạn có thể nâng cấp tất cả khách hàng của mình. Khi phát triển web, hãy hiểu cách trình duyệt hoạt động là cực kỳ quan trọng. –

Các vấn đề liên quan