2011-11-04 21 views
9

Tôi biết rằng không dễ để quản lý bộ nhớ một cách chính xác bên trong một ứng dụng có nhiều phần tử giao diện người dùng và hoàn toàn dựa trên Ajax (trong ứng dụng của tôi các trang không bao giờ được tải lại). Nhưng tôi muốn hiểu hành vi sau đây:jQuery.remove(), tách các phần tử DOM, nhưng tôi vẫn có thể truy cập các phần tử từ mã. Làm thế nào để tránh rò rỉ?

Tôi có phần tử gốc mà phần tử con duy nhất phải được đính kèm (nghĩ rằng nó là phần tử gốc là vùng chứa ứng dụng và các trang con). Bất cứ khi nào tôi chuyển đổi giữa nội dung con, tôi xóa nội dung trước đó bằng jQuery.remove(), nhưng tôi thấy rằng nội dung thực sự bị tách khỏi DOM nhưng nội dung đó vẫn còn trong bộ nhớ.

  1. gốc và hai nội dung trẻ em (child1 và child2)
  2. từ child1 tôi chuyển sang child2, yêu cầu quản lý ứng dụng của tôi để loại bỏ child1 trước khi gắn child2
  3. child2 đang được đính kèm (tôi có thể nhìn thấy nó) nhưng tôi vẫn có thể sử dụng các yếu tố child1 từ mã quản lý child1

đang child1 (nắm giữ tham chiếu đến child1 DOM):

function testaccess(){ 
    load_and_remove(child2); 
    var child1DOM = get_this_dom(); 
} 

child1DOM vẫn ở đó và tôi có thể thao tác nó như thể nó vẫn được gắn với DOM. Ok, tôi cho rằng jQuery.remove() và GC sẽ không thể giải phóng bộ nhớ cho đến khi tôi có mã sẽ truy cập nó, nhưng ngay cả khi tôi không gọi get_this_dom(), ngay cả sau khi thoát khỏi testaccess(), Tôi thấy rằng bộ nhớ FF không giảm ...

Tôi tự hỏi làm thế nào để làm cho GC phát hành tất cả bộ nhớ, khi tôi thoát child1.

+0

một cái nhìn nhanh chóng về quyền "liên quan" câu hỏi liên kết cho thấy một trường hợp tương tự -> http://stackoverflow.com/q/768621/104380 – vsync

Trả lời

6

Nó sẽ không bị xóa khỏi DOM cho đến khi tất cả các tham chiếu đến nó được phát hành.

Bạn nên cố gắng xóa tất cả các tham chiếu vòng tròn giữa JS DOM và DOM hiển thị - cả hai đều có trình thu gom rác riêng và hoạt động riêng biệt. Do đó lý do tại sao đánh dấu và quét JS rác thu không bắt những người.

Bạn có thể thử để làm lại mã của bạn để phá vỡ các tham chiếu vòng tròn:

var mything = something(); 
mything = null; 

Dưới đây là một vài điều mà có thể giúp:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

Tôi khá chắc chắn bạn có thể tìm thấy một số chi tiết khá nhanh chóng về việc này.

Ngoài ra, bạn có thể thử các .empty() để giải phóng tất cả các nút con nhưng nó gọi .remove() để làm một chút công việc.

Lưu ý rằng một số vấn đề này đã được khắc phục trong các phiên bản mới hơn của jQuery tức là 1.5 là tốt hơn 1.4 ví dụ.

Một bài đăng trên SO về điều này: jQuery memory leak with DOM removal

+1

Cám ơn câu trả lời của bạn . Tôi sẽ cố gắng tái cấu trúc một số mã của mình, ngay cả khi nó đã có hàng ngàn dòng: ( (Satckoverflow không gửi câu trả lời cho email của tôi, vì vậy tôi xin lỗi vì không trả lời một cách tinh tế ... Tôi nghĩ không ai trả lời tôi!) – giohappy

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