2010-11-25 10 views
6

¿Cuál es la forma correcta de usar Add/RemoveMemoryPressure para objetos no administrados? Tengo un objeto no administrado, pero hace un uso intensivo de, por ejemplo, contenedores STL. ¿Se supone que debo actualizar constantemente el GC administrado con cada cambio al tamaño total del objeto no administrado? ¿O simplemente es el tamaño bruto de la asignación? ¿Y cuándo llamo RemoveMemoryPressure? Finalizador? Disponer()?GC.AddMemoryPressure para objetos no administrados

+0

¿Cómo espera que el recolector de basura recopile objetos no administrados? – dtb

+1

@dtb: [GC.AddMemoryPressure] (http://msdn.microsoft.com/en-us/library/system.gc.addmemorypressure.aspx) le indica al tiempo de ejecución que hay un objeto administrado manteniendo x bytes de memoria no administrada asignado (por ejemplo, teniendo una referencia a un objeto COM). Esto podría alentar al recolector de basura a buscar objetos muertos y ejecutar su finalizador, liberando la memoria no administrada en el proceso. –

+0

@dtb: recopilando el objeto gestionado que lo posee. – Puppy

Respuesta

2

De here (y señalado por @Wim Coenen):

En el patrón de uso más simple, un objeto gestionado asigna memoria no administrado en el constructor y libera de TI en el Desechar o finalizar método. Llame al método AddMemoryPressure después de asignar la memoria no administrada, y llame al método RemoveMemoryPressure después de soltarlo.

En escenarios más complicados, donde la asignación de memoria no administrada cambios sustancialmente durante el tiempo de vida del objeto administrado, que puede llamar a la AddMemoryPressure y métodos RemoveMemoryPressure a comunicar estos cambios incrementales al tiempo de ejecución .

Así que tiene que decidir cuánto esfuerzo debe hacer para rastrear estos cambios y cuánto beneficio obtendrá.

+0

Sí, terminé alterando el asignador predeterminado para que los objetos nativos informaran al objeto maestro de todas las asignaciones, y luego usé un objeto Dispose() en el código administrado para actualizar automáticamente el GC de los cambios en todos los métodos administrados. – Puppy

Cuestiones relacionadas