Encontrar fugas de memoria es una tarea muy difícil, especialmente cuando se trata de código JS moderno que utiliza muchas bibliotecas de terceros. Por ejemplo, actualmente me estoy enfrentando a una fuga de memoria en el resumen, que involucra a babel y un complemento de babel personalizado. Estoy explorando varias estrategias comunes para cazarlos:
node --heap-prof node_modules/rollup/dist/bin/rollup -c para analizar una compilación acumulada) . Luego ábralo en Chrome Dev Tools, a través de Memory -> Load .Esta última pregunta es también mi pregunta aquí: ¿Cómo podemos analizar el árbol de asignación de objetos en Node (o en V8 en general)? ¿Cómo puedo saber dónde están pateando los objetos que identifiqué en el paso (2)?
A menudo, es la respuesta a esta pregunta la que nos dice dónde cambiar nuestro código para detener la fuga. (Por supuesto, si su problema es la rotación de memoria , en lugar de pérdidas de memoria, entonces esta pregunta probablemente no sea tan importante).
En mi ejemplo, sé que la memoria está ocupada por nodos AST de Babel y objetos de ruta, pero no sé por qué persisten, es decir, no sé dónde están almacenados. Si solo ejecuta Babel por su cuenta, puede verificar que no es Babel la que está perdiendo la memoria. Actualmente estoy probando todo tipo de trucos para averiguar dónde se almacenan, pero aún no tengo suerte.
Lamentablemente, hasta ahora, no he encontrado ninguna herramienta que me ayude con la pregunta (3). Incluso los artículos detallados relevantes (como este y su presentación de diapositivas aquí) elaboran MANUALMENTE los pasos de asignación del almacenamiento dinámico. Parece que no existe tal herramienta, ¿o me equivoco? Si no hay una herramienta, ¿tal vez hay una discusión sobre esto en alguna parte?
Chrome DevTools tiene una función "Heap Snapshot", que, entre otras cosas, le permite inspeccionar las "rutas de retención" de los objetos (que es, en esencia, su "pregunta 3"). Consulte https://developers.google.com/web/tools/chrome-devtools/memory-problems/heap-snapshots para obtener más información.
Puede conectar DevTools a Node cuando inicia Node con --inspect . Consulte https://nodejs.org/en/docs/guides/debugging-getting-started/ para obtener más información.