2011-08-19 18 views
9

He leído que fijar objetos en el montón administrado afecta el rendimiento del GC en .NET, porque el GC no puede compactar la memoria si hay objetos fijados "en el camino". Pero dado que el montón de objetos grandes no se compacta de todos modos, esto no debería aplicarse a los objetos en el LOH. ¿Hay algún otro costo oculto de fijar un objeto que está en el LOH? ¿O puedo fijar objetos de forma segura en el LOH sin degradar el rendimiento del GC?¿Fijar un objeto en el LOH afecta el rendimiento del GC?

Respuesta

5

Bueno, solo porque el Montículo de objetos grandes (LOH) no esté compactado no significa que sea no recopilado. The LOH is collected y fijar un objeto allí tendrá una ramificación en futuras asignaciones.

Como un objeto está inmovilizado, efectivamente reduce la cantidad de memoria disponible en el LOH (lo mismo que si estuviese sosteniendo una referencia). Cuando se realiza otra solicitud para asignar un objeto grande, si hay demasiadas referencias inmovilizadas/retenidas en el LOH, puede encontrar problemas al asignar más objetos grandes.

Cuando una marca se realiza durante la parte de marcaje y barrido de recolección de basura, el CLR probablemente marca todas las referencias que están puestas como raíces por lo que es probable que haya ningún impacto durante esta parte de la colección; se comportaría de la misma manera si alguien guardara una referencia al objeto grande.

Dado que la desasignación ocurre de la misma manera en el LOH (el bloque simplemente se etiqueta como disponible), esta operación tampoco se ve afectada.

Y, por último, dado que el LOH no está compactado, esta operación nunca se lleva a cabo en este montón durante un GC, por lo que esto no se ve afectado aquí.

En resumen, las asignaciones en el LOH pueden Definitivamente verse afectadas al fijar referencias a objetos en el LOH, mientras que las colecciones en el LOH probablemente no lo sean.

Aunque no olvidemos que asignar y mantener grandes bloques de memoria puede tener ramificaciones en los sistemas en general, estos comentarios son estrictamente sobre LOH.

+0

Gracias por la respuesta. No estoy seguro de obtener el segundo párrafo: ¿por qué pinning reducir la memoria disponible más que mantener una referencia? Siempre pensé que asignar algo a LOH significaba esencialmente buscar un bloque de memoria gratuito lo suficientemente grande o asignar un nuevo segmento; de ser así, cualquier bloque en vivo debería tratarse de la misma manera, con o sin pines. – Niki

+0

@nikie: ya no lo hace, solo tiene el mismo efecto (como usted ha declarado). He actualizado mi respuesta en consecuencia. Es un cambio pequeño pero significativo. – casperOne

Cuestiones relacionadas