Estoy escribiendo una aplicación financiera C# que recibe mensajes de la red, los traduce a objetos diferentes según el tipo de mensaje y finalmente aplica la lógica de negocios de la aplicación en ellos.¿Cómo evitar la recolección de basura en la aplicación .NET en tiempo real?
El punto es que después de aplicar la lógica de negocios, estoy muy seguro de que nunca necesitaré esta instancia nuevamente. En lugar de esperar a que el recolector de basura los libere, me gustaría explícitamente "eliminarlos".
¿Hay alguna manera mejor de hacerlo en C#? ¿Debería usar un conjunto de objetos para reutilizar siempre el mismo conjunto de instancias o existe una estrategia mejor?
El objetivo es evitar que la recolección de basura use cualquier CPU durante un proceso de tiempo crítico.
En .Net, la agrupación es útil cuando (a) crear un objeto determinado es lento, o (b) en una aplicación de 32 bits, para disminuir la fragmentación de memoria, de una matriz/lista/dict etc. que utiliza datos bloque> 64 KB, por ejemplo > 8K elementos x 8 B por elemento, o 16K elementos x 4 B por elemento. .Net ** nunca reubica (mueve) bloques tan grandes **, lo que puede llevar a una memoria fragmentada, si solicita diferentes tamaños cada vez. Más seguro para asignar un número de elementos suficientemente grande por adelantado, y retenerlos. (Pero borre sus campos cuando no estén en uso, para que GC pueda reclamar lo que sea que señale). Si supera el tamaño asignado, duplique los # elementos. – ToolmakerSteve
En el caso extremo, tengo una aplicación de 32 bits (debido a dependencias que no funcionan en 64 bits), así que aunque estoy en un Windows de 64 bits con mucha RAM, para evitar la fragmentación de memoria que tenía para mantener las listas de listas, de forma que cada sublista encaje en 64 KB, de modo que .Net no asigne en "montón de objetos grandes". Por lo tanto, podría "compactar" la memoria durante el GC, en lugar de crear grandes "agujeros" en el espacio de direcciones de 4 GB de la aplicación. Esta aplicación en particular fue problemática porque incluía una gran cantidad de asignación de DirectX desde la memoria nativa (no .Net). La combinación de asignaciones de .Net y .Net condujo a la fragmentación. – ToolmakerSteve