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