2013-06-07 4 views
9

Я использую Backbonejs и Requirejs для создания одностраничного веб-приложения. Похоже, мое приложение имеет memory leaks.проблема с утечкой памяти в приложении Backbonejs

Для тестирования я создал образец кода. Он создает объект вида, вызывает его функцию render и прикрепляет возвращенный html к DOM.
html имеет button. После нажатия кнопки его callback вызывает функцию destroy, где вид разрушен.

Однако, когда я запускаю chrome heap profilier, я вижу detached DOM tree, все еще висящий вокруг. Глубоко вглядываясь в него, можно увидеть references, хранящийся jQuery.

У меня есть сомнения, является ли это утечкой памяти или нет. Если да, то mycode не содержит ссылок. Проблема с этим: jQuery?

Это код link.
Я также добавил скриншоты снимков кучи.

Heap snapshot 1

Heap snapshot 2

References for Detached DOM element

+0

В качестве общего совета: при решении таких проблем попытайтесь изолировать каждый элемент: избавиться от requirejs, чтобы у вас было меньше, чем обрабатывать при отладке. Другим советом является обновление до Backbone 1.0.0 и использование новых функций 'listenTo' и' stopListening', которые были введены для решения этих проблем. Имейте в виду, что вызов 'remove' в представлении также вызывает' stopListening'. – namero999

+4

@gustavohenke backbone не имеет проблем с утечками памяти. они создаются разработчиками :) –

+0

Если у вас возникли проблемы с памятью, начните просматривать местоположение всех ваших обработчиков ... возможно, некоторые обработчики могут быть неявно заданы вашим представлением, что удаление не обрабатывается. – adrian

ответ

1

Приложение, построенное с использованием позвоночника часто имеет утечки памяти, вызванные осиротевшим видом. Я имею дело с этим, используя марионетку, которая управляет моими взглядами для меня. Использование базовой линии не является типичным подходом, поскольку это действительно инструментарий, на котором разрабатываются основы.

+3

На самом деле, Backbone отлично подходит для использования напрямую без дополнительных фреймворков и действительно используется непосредственно огромным количеством разработчиков. Однако ваша точка зрения на сиротские взгляды действительна.Управление очисткой сиротских представлений должно быть стандартным процессом любой основной реализации. – dcarson

+1

Я действительно не согласен с тем, что позвоночник «отлично» для прямого использования. Я довольно опытна во всех аспектах разработки программного обеспечения, и я использовал основную основу в прошлом году. Я вздохнул с облегчением, когда перешел в «Марионетт», и я удалил половину своего кода. Я бы всегда рекомендовал марионетку по прямому позвоночнику. –

+0

@ EngineerDollery Я использовал Marionette. Для меня это было потрясающе, но в этом случае я также очищаю свои взгляды, так что тот факт, что вид сирота потерян, меньше. Сейчас моя самая большая проблема - это утечка дерева DOM. Если вы видите последнее изображение, вы заметите, что jQuery поддерживает некоторые Я прошу вас прочесть мой код, его очень простой и он показывает мою озабоченность. – bitsbuffer

1

пройти через эту ссылку и будут получать больше идеи, и вы можете найти возможное решение вашей проблемы

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/

удачи Я надеюсь, что вы решить эту проблему быстро

+3

Добро пожаловать в Stack Overflow. Просьба подытожить ссылки в вашем ответе; Таким образом, если они будут устаревать, ответ не будет полностью бесполезным. – michaelb958

Смежные вопросы