Angular 在组件销毁时不释放内存

gby*_*gby 1 javascript v8 angular

我有两个组件:ComponentList 和 ComponentDetail。它现在的工作方式是,用户将从列表中选择一个,然后将其重定向到 ComponentDetail,该 ComponentDetail 调用 API 并获取可观察的大型数据集。现在,我遇到的问题是,当我返回 ComponentList 时,ComponentDetail 使用的内存不会在 onDestroy 时被垃圾收集。它会在十分钟后关闭,但如果从开发工具中强制进行 GC,它将快速释放内存空间。我不确定是什么导致它需要很长时间才能自动收集,我可以做些什么来使垃圾收集在 ngOnDestroy 之后立即发生吗?

jmr*_*mrk 5

(V8 开发人员在此。)

只是为了确认评论者所说的:没有办法强制立即进行垃圾收集,您不必担心它。当您的应用程序使某个对象符合垃圾收集条件(通过删除对其的所有引用)时,垃圾收集器将在下次运行时释放它,这可能很快,也可能需要一段时间。原因很简单,查找死亡对象是一项昂贵的操作,因此 V8(当然,其他 JS 引擎也是如此)经过非常仔细的调整,以在合理快速地释放内存之间找到良好的平衡(特别是当存在内存压力时)并且不会花费太多的 CPU 时间来执行此操作。

在当前的情况下,毫不奇怪,当您分配一个大对象(或一组对象),然后删除对它的所有引用,然后只是等待时,下一个 GC 周期需要一段时间才能启动在; 而如果您继续分配大对象,那么所有分配活动都将强烈提示 GC 启动并寻找可以释放的垃圾。