Angular 角度-动态组件-编译器问题-内存泄漏?

Angular 角度-动态组件-编译器问题-内存泄漏?,angular,memory-leaks,angular-compiler,Angular,Memory Leaks,Angular Compiler,我正在尝试创建一个动态组件。是普朗克的样品。 一切正常,但内存泄漏 这是github的票吗 动态创建的组件正在被销毁,但是创建动态组件的组件没有被销毁。换句话说,编译动态组件的组件没有被销毁 在上面的示例中,如果我们在“主页”和“动态页面”之间来回导航,并在chrome中拍摄内存快照,您可以看到假定要销毁的组件仍然存在,如下所示 出于测试目的,我甚至试着对下面的行进行注释,但问题仍然存在 let injector = ReflectiveInjector.fromResolvedP

我正在尝试创建一个动态组件。是普朗克的样品。 一切正常,但内存泄漏

这是github的票吗

动态创建的组件正在被销毁,但是创建动态组件的组件没有被销毁。换句话说,编译动态组件的组件没有被销毁

在上面的示例中,如果我们在“主页”和“动态页面”之间来回导航,并在chrome中拍摄内存快照,您可以看到假定要销毁的组件仍然存在,如下所示

出于测试目的,我甚至试着对下面的行进行注释,但问题仍然存在

      let injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
      let ngMdlRef = ngMdlFac.create(injector);
      let cmpFactory = ngMdlRef.componentFactoryResolver.resolveComponentFactory(DynamicHtmlComponent);
      this.cmpRef = this.vcRef.createComponent(cmpFactory);
我一打电话

this.compiler.compileModuleAsync

creator组件根本没有被销毁。在那之前没有问题


你能找个人帮忙吗。提前感谢。

你说得对,内存泄漏问题是由手动模块编译和实例化引起的。如果查看
MyCreatorComponent
的保持器,可以看到函数
DynamicHtmlComponent
DynamicModule
通过上下文保存对父
MyCreatorComponent
函数的引用

这些对象与GC根的距离最短,因此它们很可能是导致内存泄漏的对象。问题是为什么它们没有被移除?答案是Angular会大量缓存它创建的所有内容,在您的案例中也会发生。通过快速查看,我已经确定了至少两个保留引用的缓存

弗斯特 调用
var ngMdlRef=ngMdlFac.create(…)
Angular会将
DynamicHtmlComponentFactory
添加到此缓存中,并且从不删除它


请注意,这些缓存是
映射
,而不是
弱映射
,因此只要不显式调用
。delete()
对象将被保留。

而我们可以运行
编译器。clearCache
清除
compiledHostTemplateCache
以及编译器中缓存的其他内容,我们无法清除
tokenKeyCache
@yurzui,是的,这只是我找到的两个。我认为还有其他方法可以在
tokenKeyCache
中为提供者添加所有令牌,每次它执行编译,我认为这是因为编译器应该只运行一次,所以我们需要启用prodmode@yurzui,是的,看来我们无法用这种方法避免内存泄漏
export class JitCompiler {
  private _compiledHostTemplateCache = new Map<Type, CompiledTemplate>();
const _tokenKeyCache = new Map<any, string>();