Как обнаружить утечки памяти, связанные с rxjs в приложениях Angular

Существует ли какой-либо инструмент или методика обнаружения "оставленных позади" или "в настоящее время живых" наблюдаемых подписок.

Совсем недавно обнаружилась довольно неприятная утечка памяти, когда компоненты оставались в живых из-за пропущенных вызовов "отписаться". Я читал о подходе takeUntil, который кажется довольно хорошим. qaru.site/info/26462/...

Однако мне все еще интересно, есть ли какой-либо инструмент (расширение браузера и т.д.) Для этого. Насколько я знаю, Огюри не охватывает эту область.

Весь вклад очень ценится.

Ответы

Ответ 1

Отказ от ответственности: я автор инструмента, о котором я упоминаю ниже.

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

Проблемной частью является наблюдение за подписками. Прямой способ добиться этого - сделать патч с помощью метода Observable#subscribe(), то есть заменить метод-прототип Observable.

Это общий подход к Observable -profiler, инструменту разработки, который подключается к библиотеке Observable (т.е. rxjs) и печатает утечки подписок в консоли.

Простой способ использования профилировщика - начать отслеживание после загрузки приложения, а затем через некоторое время прекратить отслеживание:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { Observable } from 'rxjs';
import { setup, track, printSubscribers } from 'observable-profiler';

setup(Observable);
platformBrowserDynamic([])
    .bootstrapModule(AppModule)
    .then(ref => {
        track();
        window.stopProfiler = () => {
            ref.destroy();
            const subscribers = track(false);
            printSubscribers({
                subscribers,
            });
        }
    });

Просто вызовите stopProfiler() в консоли devtools, как только вы захотите получить отчет.