Cómo encontrar la causa de una pérdida de memoria en una aplicación .NET
Sin embargo, después de todo, el reciclaje de GC se recicla a través del sistema y las pérdidas de memoria son inevitables; por lo general, las fugas son causadas por el uso de recursos del sistema sin un reciclaje adecuado. Por ejemplo, si el programa falla repentinamente mientras escribe un archivo y el GC no participa en el reciclaje, etc., entonces algunos recursos del sistema deben reciclarse explícitamente (usando el terminador o la interfaz desechable), y esta situación similar también puede ocurrir. provocar pérdidas de memoria (reciclaje explícito Indica que los recursos utilizados no han pasado por el recopilador de GC y, por lo tanto, deben reciclarse explícitamente).
Por lo tanto, para evitar pérdidas de memoria en la programación de red, solicitamos un reciclaje explícito (finalizador de escritura o interfaz de un solo uso) para recursos no marcados e intentamos utilizar recursos administrados (se ha implementado la interfaz IDisposable). , para evitar que el sistema falle o no recicle correctamente los recursos.
También hay un caso especial, que en realidad se considera un recurso no administrado, es decir, el reciclaje de subprocesos en la programación de subprocesos múltiples. Una vez que no se presta atención a esta situación, el subproceso se dañará. Reciclado incorrectamente. Provoca pérdida de memoria. Por lo tanto, las personas que no están familiarizadas con los subprocesos múltiples deberían intentar no utilizar programación multiproceso de bajo nivel y deberían utilizar grupos de subprocesos o TPL para implementarla.
Para las pérdidas de memoria causadas por recursos no reciclados, el contenido en sí excede el entorno operativo del software .net. Por lo tanto, si necesita realizar consultas directamente, debe utilizar herramientas de terceros (herramientas de consulta de pérdidas de memoria). etc.). No puede ser monitoreado por sí mismo, por lo que es más un análisis del código y nada más (no hay manera de saber qué línea de código o miembro lo activó, y viceversa). Si considera cómo saber qué línea de código lo desencadenó, sería más fácil para el GC no notar la línea de código directamente y recuperar sus recursos antes del bloqueo).
Básicamente, los lenguajes de quinta generación no tienen forma de saber exactamente qué causa una pérdida de memoria, y si el compilador o el JIT en ejecución pueden descubrirlo (lo cual no es necesario), entonces es perfectamente capaz de conseguir que esto no ocurra. El motivo de la filtración es que no puede monitorearla, lo que está más allá de las capacidades del programador o JIT. Por lo tanto, las pérdidas de memoria solo pueden ser identificadas por un tercero (ayudando directamente a consultar los registros de espacio de memoria abiertos por las aplicaciones), pero solo pueden identificar pérdidas de memoria y manejar las fugas, y no hay nada que puedan hacer sobre sus causas.