2012-04-20 87 views
53

Gần đây, tôi đã gặp một trong những ứng dụng của tôi tiêu thụ quá nhiều bộ nhớ và tăng thêm 10 MB/giây.Làm thế nào để tiêu diệt một đối tượng JavaScript?

Vì vậy, tôi muốn biết cách tốt nhất để tiêu diệt đối tượng JavaScript và các biến để mức tiêu thụ bộ nhớ giảm xuống và FF của tôi không thể bị phá hủy.

Tôi đang gọi hai mã JavaScript của mình trong mỗi khoảng thời gian 8 giây mà không cần tải lại trang.

function refresh() { 
    $('#table_info').remove(); 
    $('#table').hide(); 
    if (refreshTimer) { 
     clearTimeout(refreshTimer); 
     refreshTimer = null ; 
    } 
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123")); 
    $("#topo").hide(); 
    $('#root').remove(); 
    show_topology(); 
} 

Làm thế nào tôi có thể xem những biến nguyên nhân Memory overhead và phương pháp để ngăn chặn thực hiện quá trình đó?

+1

Bạn đã xem xét cách ly các phần mã của bạn bằng cách đóng cửa? –

+1

Bạn đã thử mọi thứ chưa? Giống như sử dụng 'obj = null'? –

+0

A) 'show_topology' làm gì? --- B) Bạn có bao giờ xóa những thứ bạn thêm vào '# td_123' không? --- C) Có phiên bản trực tiếp nào ở đây không? – Deestan

Trả lời

65

Bạn có thể đặt tất cả các mã của bạn trong một không gian tên như thế này:

var namespace = {}; 

namespace.someClassObj = {}; 

delete namespace.someClassObj; 

Sử dụng từ khóa delete sẽ xóa tham chiếu đến bất động sản, nhưng về mức độ thấp thu rác JavaScript (GC) sẽ nhận được biết thêm thông tin về các đối tượng cần được khai hoang.

Bạn cũng có thể sử dụng Công cụ dành cho nhà phát triển Chrome để tải cấu hình bộ nhớ của ứng dụng và các đối tượng nào trong ứng dụng của bạn cần được thu nhỏ lại.

+0

Làm cách nào để bạn có thể sử dụng chrome để lấy cấu hình bộ nhớ? –

+6

Nhấn F12 để tải các công cụ phát triển. Chuyển đến tab Hồ sơ và nhấp vào Bắt đầu để bắt đầu tiểu sử. Bạn có thể làm hồ sơ trên JS CPU, CSS Selector và bạn có thể lấy ảnh chụp nhanh Heap. – Sarath

+2

hoặc trong loại chrome mới nhất hiệu suất từ ​​trong giao diện điều khiển js –

6

Cấu trúc mã của bạn để tất cả các đối tượng tạm thời của bạn được đặt bên trong bao đóng thay vì không gian tên toàn cầu/thuộc tính toàn cầu và đi ra khỏi phạm vi khi bạn đã thực hiện với chúng. GC sẽ chăm sóc phần còn lại.

26

Bạn không thể xóa đối tượng, chúng sẽ bị xóa khi không có thêm tham chiếu đến chúng. Bạn có thể xóa tài liệu tham khảo với delete.

Tuy nhiên, nếu bạn đã tạo tham chiếu vòng trong đối tượng của mình, bạn có thể phải bỏ vài thứ.

0

Tôi đã đối mặt với một vấn đề như thế này, và có ý tưởng chỉ đơn giản là thay đổi innerHTML của trẻ em của đối tượng có vấn đề.

adiv.innerHTML = "<div...> the original html that js uses </div>"; 

Dường như bẩn, nhưng nó đã cứu mạng tôi, vì nó hoạt động!

15

Trong khi các câu trả lời hiện có đã đưa ra giải pháp để giải quyết vấn đề và phần thứ hai của câu hỏi, họ không cung cấp câu trả lời cho khía cạnh tự khám phá của nửa đầu câu hỏi được in đậm: "Làm cách nào tôi có thể xem biến nào gây ra Phí trên bộ nhớ ...? "

Có thể không mạnh mẽ như cách đây 3 năm, nhưng phần Công cụ gỡ bỏ Chrome "Tiểu sử" hiện giờ khá mạnh mẽ và giàu tính năng. Nhóm Chrome có insightful article khi sử dụng và do đó cũng như cách bộ sưu tập rác (GC) hoạt động trong javascript, là cốt lõi của câu hỏi này.

delete về cơ bản là gốc của câu trả lời hiện được chấp nhận bởi Yochai Akoka, điều quan trọng là phải nhớ những gì xóa. Nó không liên quan nếu không được kết hợp với các khái niệm về cách GC hoạt động trong hai câu trả lời tiếp theo: nếu có một tham chiếu hiện có đối với một đối tượng, nó không được làm sạch. Các câu trả lời là chính xác hơn, nhưng có lẽ không được đánh giá cao vì chúng đòi hỏi nhiều suy nghĩ hơn là chỉ viết 'xóa'.Có, một giải pháp có thể có thể là sử dụng delete, nhưng nó sẽ không quan trọng nếu có một tham chiếu khác đến rò rỉ bộ nhớ.

tinh tếLàm việc mạngTất cả thích hợp đề cập đến tham chiếu vòng tròn và tài liệu của nhóm Chrome có thể cung cấp rõ ràng hơn cũng như các công cụ để xác minh nguyên nhân.

delete được đề cập ở đây, việc cung cấp tài nguyên Understanding Delete cũng có thể hữu ích. Mặc dù nó không đi vào bất kỳ giải pháp thực tế nào thực sự liên quan đến GC của js.

+1

Từ Sage - đáng giá cao từ tôi .. –

+0

Tương tự, đây là một chi tiết tốt cho câu trả lời. –

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