2012-08-26 29 views
24

Tôi có các liên kết tải các trang vào iframe. Tôi đã theo dõi sự tích tụ dữ liệu trong bộ nhớ bằng cách sử dụng bộ nhớ hồ sơ bộ nhớ của Google Chrome và tôi nhận thấy một số rò rỉ trong bộ nhớ.Iframe và quản lý bộ nhớ trong Javascript

Tôi đã tải trang và chụp ảnh chụp nhanh đầu tiên được thêm tối đa 2.69 MB. Tôi đã nhấp vào liên kết mở một trang vào iframe và lấy một ảnh chụp khác cho tôi tổng số 14.58 MB. Tôi đã gỡ bỏ các iframe sử dụng đoạn mã jquery sau:

$('#myframe').unbind(); 
$('#myframe').remove(); 
/* 
* By the way, I also tried $('#myframe > *') as a selector. 
* It still didn't work. Even if it would, it doesn't look like a viable solution to me. 
* It looks too resource intensive. 
* 
* I forgot to mention that I am not using Ajax to load my pages 
*/ 

tôi lấy ảnh chụp khác và có 5.28 MB mà chỉ ra một sự sai lệch của 2.59 MB từ giá trị ban đầu, mà theo hiểu biết của tôi chỉ ra leackage nhớ.

Bây giờ, câu hỏi của tôi là: Nếu tôi xóa khung nội tuyến (bao gồm tài liệu được tải trong đó) thì trình thu thập rác có cần phải xóa tất cả các đối tượng trong tài liệu đó khỏi bộ nhớ không? Hoặc tôi sẽ phải làm điều này bằng tay?

Tôi nghĩ rằng nếu tôi tải tài liệu vào khung nội tuyến, kích thước của nó sẽ không ảnh hưởng đến việc sử dụng bộ nhớ trên trang gốc. Tôi mặc dù nó sẽ được coi là một cửa sổ riêng biệt, nhưng rõ ràng đó không phải là một giả định được thông báo đầy đủ về phía tôi.

Bất kỳ đề xuất nào về cách giải quyết vấn đề này?

Cảm ơn bạn.

+1

Chủ đề này có vẻ là điểm nhập tốt cho vấn đề này: http://stackoverflow.com/questions/3785258/how-to -remove-dom-elements-không-bộ nhớ-rò rỉ. – bperson

+0

Điều gì sẽ xảy ra với bộ nhớ sau khi cửa sổ chính được tải xuống? –

+1

Cảm ơn. Nếu tôi làm mới cửa sổ chính, bộ nhớ sẽ quay lại '2.69 MB' – Sthe

Trả lời

15

Trong khung nội tuyến, kích hoạt tải lại trước khi xóa nó và sau đó xóa nó.

<a href="#">Remove</a> 
<iframe src="url" />​ 

$('a').click(function(){ 
    $('iframe')[0].contentWindow.location.reload(); 
    setTimeout(function(){ 
     $('iframe').remove(); 
    }, 1000); 
});​ 

DEMO here.

Ngoài ra, bạn cũng có thể thực hiện quét thủ công - tức là nếu bạn có dữ liệu trong cookie hoặc HTML5 localStorage.

window.onbeforeunload = function(){ 
    $(document).unbind().die(); //remove listeners on document 
    $(document).find('*').unbind().die(); //remove listeners on all nodes 
    //clean up cookies 
    /remove items from localStorage 
} 
+0

Cảm ơn Robin. Nó làm việc :-) – Sthe

+0

Thật không may đã không giải quyết rò rỉ bộ nhớ xem web iOS của tôi – andrewb

+1

Cảm ơn Robin, Tùy chọn đầu tiên mà bạn chia sẻ là tuyệt vời và nó hoạt động. Tôi mở 8 iframe và tôi đã đạt được 20 MB và sau khi đóng tất cả chúng và làm sạch theo cách bạn giải thích tôi có thể đòi lại tất cả 20 MB trở lại. tuyệt vời Robin sir ... –

2

Nếu bất kỳ đối tượng từ iframe được tham chiếu trong một đối tượng trong cửa sổ chính mà đối tượng sẽ không được gỡ bỏ từ DOM, do đó, nếu bạn có một cái gì đó như thế này:

cửa sổ chính:

var object = {}; 
function iframe_call(data){ 
    object.iframe_data = data.something 
} 

iframe:

function onClick(){ 
    parent_object.iframe_call(this); 
} 

điều này xảy ra đặc biệt là nếu bạn tham khảo đối tượng DOM.

+0

Cảm ơn bạn Cuzzea. Tôi thấy quan điểm của bạn, nhưng tôi không tương tác với bất kỳ thứ gì trong iframe ở giai đoạn này. Tôi vừa tải các trang ngẫu nhiên. Ngay bây giờ tôi đã không thực hiện bất kỳ kết nối nào giữa khung nội tuyến và cửa sổ chính. Bên cạnh đó, tôi cũng loại bỏ iframe cùng với nội dung của nó. – Sthe

+0

bạn có thể kiểm tra để xem chính xác những gì đã thay đổi so sánh 2 cấu hình. Bạn có thể thấy winmerge để thực hiện một dòng từ bi. Đừng quên để đặt hàng bởi nhà xây dựng để thứ tự là giống nhau – cuzzea

0
var frame = document.getElementById("myframe"); 
frame.src = "about:blank"; 

này đã làm việc từ tôi và rò rỉ bộ nhớ ngăn chặn. Ig bạn phải hủy phụ huynh của khung nội tuyến, hãy thực hiện với một số độ trễ để ngăn chặn rò rỉ bộ nhớ