首页 > 解决方案 > 内存中未释放的订阅者

问题描述

我目前正在使用 Angular v5 和 rxjs v.5.5.6。

我想减少 Angular 5 组件中的内存泄漏。我已经实施了“官方”推荐的策略,方法是在每次订阅前输入 takeUntil(this.destroy$)。

   import {takeUntil} from 'rxjs/operators';
   import { Subject } from 'rxjs/Subject';
   ...
   private destroy$ = new Subject();
   ... 

   // sample subscriber
   this.adminService.GetCompanySettings('potatoCorp').pipe(
    takeUntil(this.destroy$)
   ).subscribe(res => {}, null, null);

   // sample mergemap combinator
   this.basicMemberService.currentMember.pipe(
     mergeMap(currentMember => { 
     // do some internal logic
     return this.utilityService.getMemberInfo(currentMember.Id)/* 'Tried this'.pipe(
    takeUntil(this.destroy$))
    */
    }),
     takeUntil(this.destroy)
    ).subscribe(result => {
      // do something here
    }
)


   ngOnDestroy() {
   this.destroy$.next();
   this.destroy$.complete();

我尝试将 pipe(takeUntil) 策略添加到 mergeMap 中返回的 observable 中,但几乎没有效果。

两个堆快照的屏幕截图。 第一个是仅仅停留在主页上。 第二种是进入memberDetails后,返回首页。

第一个是仅仅停留在主页上。第二种是进入memberDetails后,返回首页。

为什么会有这么多(各种类型的)订阅者保留在内存中?目前,每次用户执行最基本的操作时,堆都会增加大约 5 MB。

标签: angularmemory-managementrxjs

解决方案


推荐阅读