2011-08-18 38 views
7

Tôi có trang web bắt đầu tập lệnh HTML5 SharedWorker. Mức sử dụng bộ nhớ Chrome tăng lên mỗi khi trang này được tải lại (nhấn F5).Rò rỉ bộ nhớ trong Chrome bằng cách sử dụng Nhân viên được chia sẻ?

Tập lệnh công nhân rất đơn giản. Mỗi giây (sử dụng setInterval) một tin nhắn được gửi đến cổng được kết nối.

Có vẻ như quy trình công nhân bị chấm dứt và khởi động lại mỗi khi tôi nhấn F5. Đây là những gì tôi mong đợi vì người lao động không thực sự được chia sẻ bởi nhiều hơn một 'tài liệu'. Tuy nhiên, tôi không thể tìm ra lý do tại sao mức sử dụng bộ nhớ tăng lên trên mỗi lần làm mới.

Có ai biết tại sao điều này xảy ra không?

Do bộ nhớ tăng lên mỗi khi trang được tải lại khiến tôi nghĩ rằng tôi không thể sử dụng công nhân được chia sẻ nào cả trong Chrome. Có ai có thể làm như vậy mà không gặp vấn đề về bộ nhớ?

CẬP NHẬT

Đây là HTML lưu trữ:

<div id="output"></div> 
<script type="text/javascript" src="/scripts/jquery-1.4.4.js"></script> 
<script type="text/javascript"> 
$(function() { 
    var worker = new SharedWorker("/scripts/worker.js") 

    worker.port.onmessage = function(e) { 
     $("#output").append($("<div></div>").text(e.data)); 
    }; 

    worker.port.start(); 
}); 
</script> 

... và đây là worker.js:

var list = []; 

setInterval(function() { 
    for (var i = 0; i < list.length; ++i) { 
     list[i].postMessage("#connections = " + list.length); 
    } 
}, 1000); 

onconnect = function (event) { 
    list.push(event.ports[0]); 
}; 

Các trang lưu trữ bắt đầu/kết nối với một nhân viên chia sẻ và đầu ra bất cứ điều gì nhận được từ nó.

Mã công nhân giữ một danh sách các cổng được kết nối và gửi một thông điệp tới tất cả các cổng một lần.

Đây là công cụ đơn giản. Tuy nhiên, mỗi khi trang lưu trữ được tải lại trong Chrome. Trọng tải bộ nhớ cho tab đó được tăng lên.

Sau đây cho thấy sử dụng bộ nhớ của Chrome sau một vài làm mới:

After refreshing a couple of times I've reached 100 MB

... sau khi làm mới một số chi tiết tôi đang đạt 250 MB ...

Reaching 250 MB after some more refreshing

Tôi đang hết ý tưởng, nghĩ rằng đây phải là một lỗi trong Chrome. Bất cứ ai có thể cho tôi một số loại con trỏ?

UPDATE 2

Vô hiệu hóa phần mở rộng AdBlock của tôi dường như để sửa chữa các vấn đề:

Running without AdBlock

Vì vậy, tôi rất vui mừng cho một thời gian ngắn nhưng nó bật ra rằng bộ nhớ vẫn bị rò rỉ. Với AdBlock bị vô hiệu hóa nó chỉ rò rỉ khá ít hơn một lần làm mới trang.

+0

Nếu bạn khởi chạy Chrome bằng cờ '--purge-memory-button', hãy mở Trình quản lý tác vụ của Chrome và nhấp vào nút Xóa bộ nhớ, bộ nhớ của tiện ích có quay lại mức ban đầu hay không? –

+0

@Chris Nó vẫn cồng kềnh. Đó là bộ nhớ của trang lưu trữ đang cồng kềnh. Chủ đề nền (mở rộng) không bị cồng kềnh, nó được khởi động lại (biến mất và xuất hiện lại trong trình quản lý tác vụ) trên mỗi lần làm mới. –

Trả lời

1

Có vẻ như nhóm Chromium đã giải quyết vấn đề này. Tôi không thể tái tạo nó nữa.

-3

Đầu tiên Đặt tên cho SetInterval myInterval = setInterval ("change()", 1000);

Sau đó, trên PageExit hoặc Thoát vv

clearInterval (myInterval); hoặc gắn trên một số sự kiện dừng khác ...

Ví dụ:

<script language="JavaScript"> 

/* Image Preloading */ 
a = new Image();a.src = "screw.jpg"; 
b = new Image(); b.src = "washer.jpg"; 
c = new Image(); c.src = "capnut.jpg"; 
d = new Image(); d.src = "coffee.gif"; 
//end image preloading 

pix = new Array("screw.jpg","washer.jpg","capnut.jpg","coffee.gif"); 

var i = 0; 
var counter = 1; 

function slideshow(){ 
ImgPreload = setInterval("change()", 1000); 
} 

function change(){ 
    document.images.pic.src = pix[i]; 
    i = i + 1; 
    if (i > (pix.length - 1)) {i = 0; counter = counter + 1;} 
    if (counter > 2) {clearInterval(ImgPreload);} 
} 
</script> 

Trong khi đây không phải là cụ thể những gì bạn đang làm nó là một nguồn lực tốt cho một hoàn cảnh tương tự. Nếu không có, clearInterval và kích hoạt tập quán bộ nhớ của bạn được lưu trữ tự động như là một cơ bản cho webkit ... nó đang cố gắng để giúp bạn bằng cách tải tải có liên quan ... Đọc nhiều hơn nữa ›

:)

+0

Cảm ơn, nhưng khoảng thời gian đang chạy trong công nhân. Vì vậy tôi không thể truy cập nó từ trang lưu trữ. Ngoài ra, kể từ khi công nhân được chấm dứt và khởi động lại khi làm mới khoảng thời gian của nó (nên được) ngầm kết thúc là tốt. –

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