Nativescript Vue v-if утечка памяти

Проблема

https://github.com/nativescript-vue/nativescript-vue/issues/492

краткий синопсис

Используя настраиваемую стратегию маршрутизации вкладок в Nativescript-Vue, я обнаружил, что в моем приложении происходит утечка памяти. Стратегия маршрутизации полагается на один всеобъемлющий компонент, который будет переключать активные компоненты с помощью оператора v-if. Когда пользователь переходит на новую страницу, оператор v-if скроет (и уничтожит) старую страницу и покажет (и смонтирует) новую страницу. Теоретически старая страница должна быть уничтожена, а память собрана сборщиком мусора; однако на практике память накапливается и, кажется, никогда не освобождается из приложения, даже при вызове сборщика мусора вручную.

тестирование и воспроизведение

Эта проблема была протестирована и обнаружена на реальном устройстве iOS (у эмулятора, похоже, нет проблем с памятью, но я читал, что это не похоже на настоящее устройство). Приведенная выше проблема github может предоставить некоторые дополнительные сведения, а связанный ниже репозиторий демонстрирует минимальное воспроизведение, вызывающее утечку памяти.

Воспроизведение этой ошибки можно найти на странице https://github.com/geodav-tech/nativescript-vue-memory-leak.

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

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

вопрос (править)

Есть ли у кого-нибудь аргументы в пользу памяти, удерживаемой приложением? Есть ли лучший способ реализовать стратегию маршрутизации, подобную этой, которая не вызывала бы утечку памяти, или что-то в потоке программы является плохой стратегией?


person Shawn Pacarar    schedule 14.05.2019    source источник
comment
Возможно, будет более подходящим опубликовать это в форме вопроса по исходной проблеме, а затем отправить содержание вашего текущего сообщения в качестве ответа и принять его. Это позволит не оставлять этот вопрос открытым, сохранит его в рамках обычного формата вопросов SO и, вероятно, упростит другим поиск этой информации в будущем.   -  person B. Fleming    schedule 15.05.2019
comment
Вы пытались использовать hide() или destroy() методы, чтобы этого избежать? Дополнительные примеры можно найти здесь: vuejs.org/v2/cookbook/avoiding-memory -leaks.html   -  person Fabio Zanchi    schedule 15.05.2019
comment
Я не уверен, что следую, поскольку метод уничтожения, указанный в этом примере, взят из внешней библиотеки. В предоставленной мной репродукции не должно быть ничего, что можно было бы разрушить. Это массив случайных идентификаторов и дополнительных имен. Установка для этого массива значения NULL или пустого массива до его уничтожения также не влияет на сохранение памяти. Я создал репозиторий репродукций, используя только ванильный javascript и nativescript-vue. нет внешнего destroy() для вызова.   -  person Shawn Pacarar    schedule 15.05.2019


Ответы (1)


Для всех, кто сталкивается с подобными проблемами утечки памяти, ответ заключается в обновлении. Проекты, сталкивающиеся с этой проблемой, были скомпилированы с: nativescript ios runtime: 5.0.0 nativescript android runtime: 5.0.0 tns-core-modules: 5.0.2 nativescript-vue: 2.0.0

Обновление до следующего устранило проблему. nativescript ios runtime: 5.4.0 nativescript android runtime: 5.4.0 tns-core-modules: 5.4.0 nativescript-vue: 2.2.2

Теперь та же самая структура освобождается после перехода от нее.

person Shawn Pacarar    schedule 15.05.2019