2017-01-14 5 views
1

Я портирую огромное приложение angular.js/node для NW.js. Все было нормально, пока я не проверил использование памяти в приложении. Когда приложение запустилось, nwjs Помощник процесс потреблял 75 МБ. После первой перезагрузки - использование location.reload() или win.reload() - использование памяти увеличилось до 110 МБ. Вторая перезагрузка, 125 МБ. Третий перезагрузка, 155 МБ, четвертая перезагрузка, 180 МБ. Пятая перезагрузка, 205 МБ, Шестая перезагрузка 235 МБ ... и так далее. При 20 или 25 перезагрузках приложение разбилось. У приложения есть процессы дочерних узлов, которые поддерживают их использование памяти в 30 МБ при перезагрузке. Контекст, разделяемый между узлом и хром, отсутствует, все процессы связи между узлами и хром выполняются с использованием localStorage. Такое же угловое приложение, работающее на Chrome как веб-приложение, не имеет утечек памяти, и память начинается с нуля при каждой перезагрузке.Сбросить всю память при перезагрузке в NW.js

Я нашел частичное решение, используя chrome.runtime.reload(), но проблема заключается в том, что он не только обновляет представление chrome, но и все дочерние процессы (это похоже на выход и перезапуск приложения). Мне нужно обработать процессы узлов, когда основное представление обновляется. Я читал на форумах, что у многих людей такая же проблема с утечками памяти, возникающими при переходе со страницы на другую страницу в веб-браузере Chrome. Я попытался стереть весь узел памяти узлом перед перезагрузкой, и ничего не происходит (используя программу Black Hole от Robert CMoses Kałamański). Я пробовал использовать global.gc() с "js-flags": "--expose-gc", и ничего не произошло.

Я сделал еще одно простое приложение только с несколькими переменными, и при перезагрузке появилась такая же утечка памяти. Я попробовал демонстрационное приложение NW.js (когда вы просто запустили nwjs без каких-либо параметров), и он выглядит серым экраном с версиями nw, chrome и node. Если вы щелкните правой кнопкой мыши-Перезагрузить приложение несколько раз на этой простой странице, использование памяти также повысится ... OMG !!!!

Есть ли способ сбросить всю память хрома в NW.JS перед тем, как выгрузить окно при перезагрузке? Есть ли безопасный способ удаления всех объектов javascript и узлов DOM? Или это ошибка управления памятью NW.js?

Я использую NW.js V 0.19.4

ответ

0

Пожалуйста, убедитесь, что нет никаких ссылок на DOM объекты в контексте узла. Контекст узла живет на фоновом экране и продолжает работать в течение всей жизни приложения. Для этого используйте профилирование кучи в devtools, чтобы узнать, какие объекты переданы.

Другой способ - использовать режим «смешанного контекста», где контекст узла и контекст DOM одинаковы.

Подробнее здесь: http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/

+0

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

+0

Просто протестирован в nw.js 0.19.5 с SDK и без него, та же проблема ... –

+0

Роджер, я действительно буду благодарен вам за поддержку. У меня также есть два старших члена моей команды, которые расследуют этот вопрос без каких-либо новостей, и если мы не сможем найти решение, нам придется перейти к электрону (не по моему вкусу, но без этой проблемы с утечкой памяти, насколько мы исследовали в форумах). Приложение построено на угловом js 1.5 и огромно в коде (приложение для ресторанов с более чем 300 ресторанами, использующими его, проверьте Toteat). Приложение имеет процессы узла, которые прослушивают HTTP-запрос на порту 80 и сокет в порте 8080. Вся связь осуществляется через localStorage, и данные сохраняются в websql. –

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