2010-04-15 13 views

Respuesta

5

Solo hay dos tipos de recursos que puedo pensar que se agrupan comúnmente: subprocesos y conexiones (es decir, a una base de datos).

Ambos tienen una preocupación general: Escasez.

  • Si crea demasiados hilos, el cambio de contexto consumirá todo el tiempo de su CPU.
  • Si crea demasiadas conexiones de red, la sobrecarga de mantener esas conexiones se vuelve más trabajosa que lo que se supone que deben hacer las conexiones.
  • Además, para una base de datos, el recuento de conexiones puede estar limitado por razones de licencia.

Por lo tanto, la razón principal por la que desea crear un grupo de recursos es si solo puede permitirse tener un número limitado de ellos al mismo tiempo.

4
  1. Cuando la creación de objetos es caro
  2. Cuando potencialmente puede experimentar la presión de memoria - demasiados objetos (por ejemplo - flyweight)
5

Yo añadiría fragmentación de la memoria a la lista. Esto puede ocurrir cuando se usan objetos que encapsulan recursos nativos que, una vez asignados, no pueden ser movidos por el recolector de basura y podrían potencialmente fragmentar el montón.

Un ejemplo de la vida real es cuando crea y destruye muchos sockets. Los almacenamientos intermedios que utilizan para leer/escribir datos deben fijarse para poder ser transferidos a la API WinSock nativa, lo que significa que cuando se produce una recolección de basura, aunque parte de la memoria se recupera para los sockets que se destruyeron, podría dejar el memoria en un estado fragmentado ya que el GC no puede compactar el montón después de la recopilación. Por lo tanto, los búferes de lectura/escritura son los principales candidatos para la agrupación. Además, si está utilizando objetos SocketEventArgs, esos también serían buenos candidatos.

Aquí hay un good article que habla sobre el proceso de recolección de basura, compactación de memoria y por qué la agrupación de objetos ayuda.

0

Hay un excelente artículo de la revista MSDN llamado Redescubra el arte perdido de la optimización de la memoria en su código administrado por Erik Brown http://msdn.microsoft.com/en-us/magazine/cc163856.aspx. Incluye un grupo de objetos de propósito general con un programa de prueba. Este grupo de objetos admite tamaños mínimo y máximo. No puedo encontrar ninguna referencia a personas que usan esto en producción. ¿Alguien lo ha hecho? Además, habiéndome ocupado de la fragmentación de la memoria en una aplicación ASP.NET, puedo dar fe del valor en la respuesta de Miky Dinescu. Además, elaborando un poco sobre la respuesta de Vitaly, considere el caso de objetos grandes (es decir,> 85K) que son caros de crear. Los objetos grandes solo participan en la recolección de basura Gen 2. Esto significa que no se recogerán tan rápido como los objetos que participan completamente en la recolección de basura en Gen 0 y Gen 1. Este artículo Montón de objetos grandes descubierto por Maoni Stephens en http://msdn.microsoft.com/en-us/magazine/cc534993.aspx explica el montón de objetos grandes en detalle.

1

Para juegos GC puede introducir un retraso no deseado en algunas situaciones.Si este es el caso, reutilizar objetos puede ser una buena idea. Hay algunas consideraciones útiles sobre el tema en this thread.

Cuestiones relacionadas