Mi aplicación ASP.NET - sistema B2B - solía comenzar en 35-40MB cuando llegó el primer usuario. Después de tantos minutos, la aplicación solía crecer hasta 180 MB con 2 o 3 usuarios golpeando páginas. Después de leer las mejores prácticas de desarrollo .net y la guía de rendimiento de GC, descubro que el problema era el diseño de mi aplicación. No estuve de acuerdo de una vez.
Estaba horrorizado de lo fácil que podemos hacer los errores. Renuncié a muchas características y comencé a facilitar algunos objetos. Significado:
evitar mezclar tanto las páginas y controles de usuario inteligentes y comunicativos (las que tienen gran cantidad de funcionalidades que en realidad la mayoría existir para cada página que utiliza este control).
Dejar de generar funcionalidades universales en las clases base. Algunas veces es preferible repetir. La herencia es costo
En algunas funciones complejas pongo todo en la misma función. SÍ, llegando a 100 líneas más. Cuando leí esta recomendación sobre la guía de rendimiento de .net, no lo creí pero funciona. Las pilas de llamadas son un problema, el uso de propiedades de clase sobre las variables locales es un problema. Las variables de nivel de clase pueden ser un infierno ...
Deje de usar clases base complejas, no debe haber clases base con más de 7 líneas. Si expandes clases más grandes en todo el framework, tendrás problemas.
Comienzo a usar más objetos estáticos y funcionalidades. Vi la aplicación que el otro chico diseñó. Todos los métodos de objetos de acceso a datos (insertar, actualizar, eliminar, seleccionar) eran estáticos. La aplicación con más usuarios simultáneos nunca llega a más de 45 MB.
Para guardar algunos proyectos, me gusta el patrón de estado de reposo. Aprendí en el mundo real, pero el autor Nygard también está de acuerdo conmigo en su libro: Release IT - Diseñe e implemente software de producción preparada. Él llama a tal enfoque como un patrón de estado estable. Este patrón dice que podemos necesitar algo para liberar recursos inactivos.
Es posible que desee jugar con el archivo de configuración de la máquina. En el atributo memoryLimit, indicará el porcentaje de memoria que podría alcanzarse antes de que un proceso se recicle.
Es posible que también quiera jugar en el archivo de configuración de la máquina. En este atributo, GC dictará el comportamiento de la máquina (Workstation GC y Server GC). Esta opción también puede cambiar drásticamente el comportamiento de consumo de la memoria.
Tuve mucho éxito cuando empecé a preocuparme por estos artículos. Espero que esto ayude.
- EDITADO EN 04-05-2014 He cambiado de opinión sobre muchas cosas debido a las mejoras de las nuevas versiones de GC y los avances de HTML 5 y MVC framework.
Esa línea de código solo se activa cada 3 minutos, por lo que probablemente no tenga mucho impacto. – Fantius
Preguntas relacionadas: [Prevenir la recolección de elementos no deseados de .NET durante un breve período de tiempo] (http://stackoverflow.com/questions/6005865), [¿Cómo evitar la recolección de elementos no utilizados en la aplicación .NET en tiempo real?] (Http: // stackoverflow .com/questions/85283) –