Angular 组件销毁时不释放内存
Angular not releasing memory on component destroy
我有两个组件:ComponentList 和 ComponentDetail。它现在的工作方式是,用户将从列表中选择一个,然后将其重定向到调用 API 的 ComponentDetail 并获取可观察对象的大型数据集。现在,我遇到的问题是当我返回 ComponentList 时,ComponentDetail 使用的内存在 onDestroy 时没有被垃圾回收。它会在十分钟后关闭,但如果从 devtools 强制 GC,它会快速释放内存 space。我不确定是什么导致它需要很长时间才能自动收集,我可以做些什么来让垃圾收集在 ngOnDestroy 之后立即发生吗?
(此处为 V8 开发人员。)
只是为了确认评论者所说的话:没有办法强制立即进行垃圾回收,您不必为此担心。当您的应用程序使对象符合垃圾回收条件(通过删除对它的所有引用)时,垃圾回收器将在下次运行时释放它,这可能很快,或者它可能需要一段时间。原因很简单,找到死对象是一项代价高昂的操作,因此 V8(当然,其他 JS 引擎也是如此)经过非常仔细的调整,以在合理快速地释放内存(尤其是存在内存压力时)之间找到良好的平衡。并且不会在这上面花费太多 CPU 时间。
在手头的案例中,毫不奇怪,当您分配一个大对象(或一组对象),然后删除对它的所有引用,然后等待,这将需要一段时间下一个 GC 周期开始;而如果您继续分配大对象,那么所有分配 activity 将强烈提示 GC 启动并寻找它可以释放的垃圾。
我有两个组件:ComponentList 和 ComponentDetail。它现在的工作方式是,用户将从列表中选择一个,然后将其重定向到调用 API 的 ComponentDetail 并获取可观察对象的大型数据集。现在,我遇到的问题是当我返回 ComponentList 时,ComponentDetail 使用的内存在 onDestroy 时没有被垃圾回收。它会在十分钟后关闭,但如果从 devtools 强制 GC,它会快速释放内存 space。我不确定是什么导致它需要很长时间才能自动收集,我可以做些什么来让垃圾收集在 ngOnDestroy 之后立即发生吗?
(此处为 V8 开发人员。)
只是为了确认评论者所说的话:没有办法强制立即进行垃圾回收,您不必为此担心。当您的应用程序使对象符合垃圾回收条件(通过删除对它的所有引用)时,垃圾回收器将在下次运行时释放它,这可能很快,或者它可能需要一段时间。原因很简单,找到死对象是一项代价高昂的操作,因此 V8(当然,其他 JS 引擎也是如此)经过非常仔细的调整,以在合理快速地释放内存(尤其是存在内存压力时)之间找到良好的平衡。并且不会在这上面花费太多 CPU 时间。
在手头的案例中,毫不奇怪,当您分配一个大对象(或一组对象),然后删除对它的所有引用,然后等待,这将需要一段时间下一个 GC 周期开始;而如果您继续分配大对象,那么所有分配 activity 将强烈提示 GC 启动并寻找它可以释放的垃圾。