Tengo dos componentes: ComponentList y ComponentDetail. La forma en que funciona en este momento es que un usuario elegirá uno de la lista y lo redirigirá al ComponentDetail que llama a una API y obtiene un gran conjunto de datos para un observable. Ahora, el problema que estoy encontrando es que cuando vuelvo a ComponentList, la memoria que usa ComponentDetail no se recolecta basura en OnDestroy. Se cae después de diez minutos, pero si se forzara la GC desde las herramientas de desarrollo, liberaría el espacio de la memoria rápidamente. No estoy seguro de cuál es la causa de que tarde mucho tiempo en recopilarse automáticamente. ¿Hay algo que pueda hacer para que la recolección de elementos no utilizados se realice justo después de ngOnDestroy?
(Desarrollador V8 aquí.)
Solo para confirmar lo que han dicho los comentaristas: no hay forma de forzar la recolección de basura inmediata, y no debería tener que preocuparse por eso. Cuando su aplicación hace que un objeto sea elegible para la recolección de elementos no utilizados (eliminando todas las referencias a él), el recolector de elementos no utilizados lo liberará la próxima vez que se ejecute , lo que podría ser bastante pronto o podría llevar un tiempo. La razón es simplemente que encontrar objetos muertos es una operación costosa, por lo que V8 (y, por supuesto, otros motores JS) se ajustan con mucho cuidado para encontrar un buen equilibrio entre liberar memoria razonablemente rápido (especialmente cuando hay presión de memoria) y no gastar demasiado tiempo de CPU en hacerlo.
En el caso que nos ocupa, no es sorprendente que cuando asigna un solo objeto grande (o grupo de objetos), y luego elimina todas las referencias a él, y luego simplemente espera, tomará un tiempo para que comience el próximo ciclo de GC. en; mientras que si continúa asignando objetos grandes, entonces toda esa actividad de asignación sería una pista fuerte para que el GC se active y busque la basura que puede liberar.