2013-06-07 40 views
9

Tôi đang sử dụng BackbonejsRequirejs để tạo một ứng dụng web một trang. Có vẻ như ứng dụng của tôi có số memory leaks.vấn đề rò rỉ bộ nhớ trong Ứng dụng Backbonejs

Để thử nghiệm, tôi đã tạo mã mẫu. Nó tạo ra một đối tượng xem, gọi hàm render của nó và đính kèm trả lại html vào DOM.
Trả lại htmlbutton. Sau khi nhấp vào nút, chức năng callback gọi destroy của nó trong đó chế độ xem bị hủy.

Tuy nhiên, khi tôi chạy chrome heap profilier, tôi có thể thấy detached DOM tree vẫn treo xung quanh. Nhìn sâu vào nó, người ta có thể thấy references được giữ bởi jQuery.

Tôi nghi ngờ đây có phải là rò rỉ bộ nhớ hay không. Nếu có mycode không giữ bất kỳ tham chiếu nào. Vì vậy, vấn đề nằm ở jQuery?

Đây là link để lấy mẫu mã.
Tôi cũng đã đính kèm ảnh chụp màn hình của ảnh chụp nhanh heap.

Heap snapshot 1

Heap snapshot 2

References for Detached DOM element

+0

Như một lời khuyên chung: khi đối phó với loại vấn đề này, hãy cố gắng cách ly từng phần tử: loại bỏ requirejs để bạn có ít mảnh hơn để xử lý trong khi gỡ lỗi. Một lời khuyên khác là nâng cấp lên Backbone 1.0.0 và sử dụng các hàm 'listenTo' và' stopListening' mới, đã được giới thiệu chính xác để xử lý các loại vấn đề này. Hãy nhớ rằng việc gọi 'remove' trên một View cũng sẽ gọi là' stopListening'. – namero999

+4

@gustavohenke xương sống không có bất kỳ vấn đề với rò rỉ bộ nhớ. chúng được tạo bởi các nhà phát triển :) –

+0

Nếu bạn gặp vấn đề về bộ nhớ, hãy bắt đầu xem xét vị trí của tất cả các trình xử lý của bạn ... có thể có một số trình xử lý được đặt ngầm định bởi chế độ xem của bạn mà loại bỏ không xử lý. – adrian

Trả lời

1

ứng dụng xây dựng xương sống thường có rò rỉ bộ nhớ do quan điểm mồ côi. Tôi đối phó với điều này bằng cách sử dụng marionette mà quản lý quan điểm của tôi cho tôi. Sử dụng xương sống trực tiếp không phải là một cách tiếp cận điển hình, vì nó thực sự là một bộ công cụ mà trên đó các khung công tác được phát triển.

+3

Trên thực tế, xương sống là tốt để sử dụng trực tiếp mà không cần các khuôn khổ bổ sung và thực sự được sử dụng trực tiếp bởi một số lượng lớn các nhà phát triển. Tuy nhiên, quan điểm của bạn về quan điểm mồ côi là hợp lệ.Quản lý việc dọn dẹp các chế độ xem mồ côi nên là quy trình chuẩn của bất kỳ việc triển khai xương sống nào. – dcarson

+1

Tôi không thực sự đồng ý với xương sống là 'tốt' để sử dụng trực tiếp. Tôi khá có kinh nghiệm trong mọi khía cạnh của phát triển phần mềm, và tôi đã sử dụng chính xương sống của mình trong năm qua. Tôi thở phào nhẹ nhõm khi tôi chuyển đến Marionette, và tôi đã xóa một nửa mã của mình. Tôi sẽ luôn luôn đề nghị Marionette qua xương sống trực tiếp. –

+0

@EngineerDollery Tôi đã sử dụng Marionette. Nó đã làm công việc tuyệt vời cho tôi, nhưng trong trường hợp này tôi cũng làm sạch quan điểm của tôi để thực tế là xem được mồ côi là less.Right bây giờ mối quan tâm lớn nhất của tôi là bị rò rỉ DOM tree.If bạn thấy hình ảnh cuối cùng bạn sẽ nhận thấy jQuery là giữ một số references.I yêu cầu bạn vui lòng đi qua mã của tôi, nó rất đơn giản và nó cho thấy mối quan tâm của tôi. – bitsbuffer

1

đi qua này liên kết u sẽ có được ý tưởng hơn và bạn có thể tìm thấy giải pháp cho vấn đề của bạn

https://paydirtapp.com/blog/backbone-in-practice-memory-management-and-event-bindings/

http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/

best of luck Tôi hy vọng bạn giải quyết vấn đề này một cách nhanh chóng

+3

Chào mừng bạn đến Stack tràn. Vui lòng tóm tắt các liên kết trong câu trả lời của bạn; theo cách đó, nếu họ đi cũ thì câu trả lời sẽ không hoàn toàn vô dụng. – michaelb958