¿Fue útil?

Solución

  

Cuando

No es demasiado rápido. En general, es muy barato para tener objetos de corta vida. Para una caché sea rentable tendría que ser (muy) muchos candiadates y que debe vivir el tiempo suficiente para llegar a la siguiente generación.

  

¿Cómo se puede diagnosticar si se trata de un problema?

Con un generador de perfiles. No estoy tan seguro de que el autor del artículo que hice.

  

¿Cuánto de un problema se gestiona la fragmentación del montón en un lenguaje administrado como C #?

Por lo que yo sé, es raro. NET tiene un recolector de basura de compactación, que impide que la mayoría de las formas de fragmentación. Hay problemas con el objeto grande Montón veces.


Editar:

Cuando usted va a través de los comentarios a continuación el artículo encontrará que alguien lo midió y encontró el caché a ser mucho más lento que la creación de nuevos EventArgs cada vez.

Conclusión: Medida antes de empezar a optimizar. Esto no era una buena idea / ejemplo.

Otros consejos

Gestionado fragmentación del montón es generalmente debido a la fijación de objetos. Los objetos se ven puestas en código administrado pasa el puntero del objeto al código nativo y el objeto no se pueden mover porque la referencia se pasa al código nativo. Esto es muy común cuando hay una gran cantidad de actividades de E / S. Como se mencionó anteriormente, por lo general ocurre sólo en LOH.

Aquí está un ejemplo de La fragmentación en Gen0 Montón

A diferencia de otras respuestas que se dan aquí Estado I: sí, uno debe tener cuidado de fragmentación! No sólo se aplica a montones administrados sino a todas las aplicaciones de manipulación (por lo menos)

  • muchos "grandes" en Recursos
  • un patrón de asignación pesada.

Desde el LOB no quede compactado, que - con el tiempo - lo más probable que se fragmentan en cuanto el tamaño y número de los objetos superar un valor determinado (que se refiere a la HEAPSIZE máximo total disponible). Si lo hace, la única manera segura es limitar el número de referencias al instante holded a esos objetos. Una memoria caché (piscina) sólo ayudaría, si los objetos agrupados pueden ser reutilizados. A veces, si estos están hechos de Recursos matrices de longitud variable F. E., que podría no ser reutilizable fácilmente. Así que la agrupación no puede ayudar mucho aquí.

¿Cómo detectarlo? Siempre que hay una gran presión sobre el montón de LOB. ¿Cómo saber que es? Utilice el contador de rendimiento .NET "Colección Conde Gen 0 ... 2" al mismo tiempo. Si hay demasiados objetos grandes se asignan desde el LOB, todos los contadores evolucionarán de forma idéntica. Es decir, básicamente, todas las colecciones son caros generación 2 colecciones. En ese caso, no se debe hacer algo.

En cuanto a los objetos más pequeños, que permitiría que el GC haga todo el trabajo en Gen 0 colecciones y preocupación Dont.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top