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
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.
- 1. ¿La ofuscación afecta el rendimiento?
- 2. ¿El uso de un marco PHP afecta el rendimiento?
- 3. z-index, ¿cómo afecta el rendimiento?
- 4. Cómo fijar un puntero al objeto administrado en C#?
- 5. ¿Por qué el orden de JIT afecta el rendimiento?
- 6. ¿La colocación de un bloque try-catch afecta el rendimiento?
- 7. Contando el número de GC limpiadas en un objeto
- 8. ¿El tamaño de la tabla afecta el rendimiento de INSERTAR?
- 9. ¿El tamaño de ensamblado .NET afecta el rendimiento?
- 10. ¿Qué es el aliasing y cómo afecta el rendimiento?
- 11. ¿El número de columnas afecta el rendimiento de la consulta?
- 12. ¿El uso de funciones anónimas afecta el rendimiento?
- 13. ¿El límite máximo de la propiedad de configuración MaxReceivedMessageSize en wcf afecta el rendimiento del servicio?
- 14. En SQL, ¿cómo afecta el uso de DISTINCT al rendimiento?
- 15. ¿Cómo afecta la cláusula IN el rendimiento en Oracle?
- 16. ¿Cómo afecta la llamada al método el rendimiento en Java?
- 17. ¿Cómo funciona Object.GetHashCode cuando el GC mueve un objeto?
- 18. GC.SuppressFinalize el rendimiento en comparación con el objeto no finalizable
- 19. C# ¿Cómo puedo fijar un objeto en la memoria sin ordenar el objeto?
- 20. ¿La estructura del espacio de nombre o de la carpeta afecta el rendimiento de un ensamblaje?
- 21. ¿La cantidad de espacios de nombres afecta el rendimiento?
- 22. ¿Existe una relación entre el tamaño del objeto y el rendimiento de bloqueo en Java?
- 23. Mantener el objeto en intento de destrucción de GC
- 24. ¿El tamaño de un archivo jar afecta el rendimiento de la JVM?
- 25. java.lang.OutOfMemoryError: el límite superior del GC excedió
- 26. .NET Collections y el Large Object Heap (LOH)
- 27. Duración del tiempo GC excesivo en "java.lang.OutOfMemoryError: el límite superior del GC excedió"
- 28. ¿El uso de espacios de nombres afecta el rendimiento o el tiempo de compilación?
- 29. ¿La longitud del campo de la base de datos (máxima) afecta el rendimiento?
- 30. ¿El orden de las condiciones en una cláusula WHERE afecta el rendimiento de MySQL?
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
@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