Últimamente, mi equipo y yo nos hemos enfocado más en abordar el alto uso de memoria en nuestra aplicación Electron. Nuestra aplicación tiene un par de procesos de representación que, a medida que pasa el tiempo, pueden terminar consumiendo gigas de memoria, cuando nuestra aplicación no usa ni cerca de esa cantidad de memoria. Lo más probable es que tengamos que pasar una buena cantidad de tiempo rastreando esta(s) fuga(s).
La clave que me tiene completamente confundido acerca de lo que está sucediendo es que cuando busco en Chrome Devtools en la pestaña de memoria, el valor parece completamente razonable en comparación con los valores que extraemos del Monitor de actividad. (Las imágenes a continuación fueron capturadas al mismo tiempo)
No sé muy bien por dónde empezar con esta información. ¿Por qué estos números son tan diferentes? ¿Nuestra aplicación web tiene una fuga que solo se expone a través de la memoria de la aplicación Electron? ¿Hay algún problema con la configuración de Electron para representar nuestra aplicación? ¿Son ambos?
Este tipo de problema parece ser común cuando se usa Electron, pero por mi vida no puedo encontrar recursos para comenzar a depurar realmente este problema. No estoy necesariamente buscando una respuesta directa sobre mi configuración, ya que no he proporcionado suficiente información directamente para eso. Solo estoy en una misión de investigación para obtener una mejor comprensión de cómo depurar este tipo de problema dentro del ecosistema de Electron.
No sé mucho sobre Electron, ¡pero disfruto investigando y este tipo de cosas! Ciertamente no tengo una solución clara para usted, pero espero que algunas de estas cosas puedan ayudarlo a depurar o hacer algún progreso en sus problemas de memoria.
Una cosa a mencionar es que podría tener un problema de memoria con 3 cosas separadas:
Otra cosa a mencionar es que no es necesariamente una "fuga de memoria", sino que también podría ser simplemente una hinchazón de la memoria. La diferencia es que con una fuga de memoria, seguirá perdiendo memoria hasta que se bloquee, mientras que con una memoria hinchada, simplemente acaparará toda la memoria hasta que no quede nada antes de que comience a eliminar cosas viejas de la memoria.
Por las cosas que ha compartido, es muy difícil saber dónde podría estar un problema sin depurarlo y resolverlo. Entonces, lo que haría sería primero asegurarme de que no sea su propio código el que esté causando la fuga/inflación, intente ejecutar pequeñas partes de su código y vea si la memoria sigue siendo un problema, luego comience a agregar más partes de su código de forma incremental hasta que has añadido todo. Si en algún momento la memoria comienza a ser un problema, es probable que sea el código en sí mismo (pero no necesariamente, entonces al menos habrá identificado de qué se trata). Por ejemplo, si la memoria comienza a aumentar repentinamente en el componente de la imagen que ha utilizado, puede señalar que tiene algo que ver con las imágenes o el almacenamiento en caché.
Cosas potenciales que puedes probar
Creo, intuitivamente, que el problema está en el almacenamiento en caché. Me parece que Electron puede usar una cantidad absurda de memoria y si está almacenando imágenes en caché constantemente sin borrarlas, acaparará la memoria hasta que no quede nada, antes de que comience a eliminar cosas viejas del caché. Lo que es peor es que si está utilizando memoria de intercambio/virtual y la RAM se llena, también los escribirá en el disco antes de eliminarlo de la RAM, lo que también podría explicar un aumento en el espacio en disco. Personalmente, intentaría deshabilitar todo el almacenamiento en caché y ver qué sucede. Esto también es algo que puede ver aquí: Cambiar backgroundImage causa pérdida de memoria (Electron) . Aquí hay otro ejemplo: Cambiar el src de la imagen constantemente / uso de memoria (Electron) , en este caso creo que la persona que respondió a esta pregunta probablemente vio una disminución en la memoria debido a que las imágenes ya no se almacenan en caché cuando estaba usando base64 en su lugar. Aquí hay otro problema en Chromium: https://forums.raspberrypi.com/viewtopic.php?t=296598 , donde también funcionó la limpieza de la tonelada de archivos en caché. Aquí, perfilado de uso de memoria de electrones , es otra persona que dice que todo lo que estaba haciendo era "mostrar imágenes". El almacenamiento en caché está haciendo que mis sentidos arácnidos hormigueen.
Lista completa y aburrida de cosas que puedes probar/mirar
https://github.com/electron/electron/issues/21586
Hay un problema abierto en Electron con una pérdida de memoria al abrir y cerrar ventanas.
Pérdida de memoria del emisor de eventos en la aplicación Electron
Hay un ejemplo de dónde el código en sí estaba causando una pérdida de memoria, pero también puede ser un código relacionado con Electron.
Fuga de memoria en BrowserWindow, Electron
Hay otro ejemplo de dónde el código puede romperlo y, en este caso, también es específico de Electron.
Uso creciente de memoria de cromo y cromo
Hay un ejemplo de una fuga de memoria causada en cromo, sin embargo, no tengo idea de si eso fue realmente un problema, ya que nunca se respondió.
¿Cómo aumentar el límite máximo de memoria para la aplicación creada por electron-builder?
Puede intentar aumentar/disminuir la memoria usando max-old-space-size .
Otra consideración clave
La otra cosa más viable que encontré fue https://seenaburns.com/debugging-electron-memory-usage/ , que finalmente llegó a la conclusión de que tenía algo que ver con RSS (y también con el almacenamiento en caché). Esta persona, https://spectrum.chat/electron/general/debugging-high-memory-usage-in-electron~80057ff2-a51c-427f-b6e1-c297d47baf5b , también mencionó que es relativo a RSS y también encontré un problema abierto para electron aquí: https://github.com/electron/electron/issues/25208 , que está relacionado con una fuga de memoria RSS.
nota final
Electron usará una tonelada de memoria porque está ejecutando un navegador completo dentro de un navegador/escritorio, Chromium, además de ejecutar v8 y todo su propio código. Junto con eso, Chromium ya es conocido por su alto uso de memoria. Así que es relativamente normal ver mucha memoria. Junto con eso, si la memoria solo se está inflando, es un problema más fácil de resolver identificando qué lo está inflando, que es muy probable que sea algo así como un caché. Si se trata de una pérdida de memoria, podría ser cualquier cosa, probablemente su propio código, pero también podría ser un error oficial en Electron o Chromium.
Si todo lo demás falla, simplemente puede subirse al carro https://www.reddit.com/r/programming/comments/7p7s8q/electron_is_cancer/ . En mi experiencia, las cosas escritas en Electron son increíblemente lentas, consumen mucha memoria y no sobreviven en un navegador, siendo Discord y Slack los principales culpables. Puedo dejar abierta cualquier aplicación en mi navegador durante días sin problemas, pero si dejo cualquiera de ellas, mi navegador finalmente colapsará. Zoom es un poco mejor, pero es probable que se deba a que usan sus propios SDK y solo usan Electron como interfaz, mientras que Atom también es mejor que la mayoría de las aplicaciones, pero como señala uno de los comentarios principales en esa publicación, han reescrito algunos de los partes centrales en c++. No sé mucho sobre Electron, así que no tengo una opinión creíble al respecto, pero las aplicaciones que utilizo creadas con Electron siempre tienen los mismos problemas de memoria. Creo que Electron es una idea y un concepto increíbles y que las aplicaciones han mejorado mucho con el tiempo, así que respeto a los equipos que trabajan en él, pero también creo que todavía tiene muchos problemas que resolver, especialmente cuando se trata de memoria.