¿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
Respuesta
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á.
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
- 1. CDI con objetos no administrados
- 2. ¿Debo llamar a Dispose() en objetos administrados?
- 3. Cuál usar: algoritmos de hash administrados frente a no administrados
- 4. Datos principales: crea varios objetos administrados, pero solo guarda algunos?
- 5. ¿Los objetos COM dinámicos se consideran recursos administrados?
- 6. Crear servicio WCF para clientes C++ no administrados
- 7. Subprocesos no administrados Spring Quartz Websphere Hibernate
- 8. ¿Dónde DLLImport busca archivos DLL no administrados?
- 9. ¿Qué son exactamente los recursos no administrados?
- 10. Pasar punteros no administrados en C++/CLI
- 11. Donde se asignan los recursos no administrados
- 12. ¿Por qué no puedo ver una plantilla de archivo de clase de objetos administrados en Xcode?
- 13. El tipo escalar en objetos administrados solo funciona para el iPhone 5
- 14. Fusionando .net dlls administrados
- 15. Lenguajes de programación administrados de código abierto
- 16. ¿Por qué los beans administrados no se cargan en Tomcat?
- 17. ¿Cuál es el punto de usar GC.AddMemoryPressure con un recurso no administrado?
- 18. Android: mediaplayer se fue con eventos no administrados
- 19. Motores polimórficos, en idiomas administrados?
- 20. ios actualizaciones de coredatos no vistas en diferentes contextos de objetos administrados - los datos son diferentes entre contextos
- 21. Como llegar memoria no utilizada de vuelta de la gran montón de objetos LOH desde múltiples aplicaciones administrados?
- 22. ¿Cómo enumerar todos los objetos administrados en el montón en .Net?
- 23. Obteniendo la lista de hilos actualmente activos administrados en .NET?
- 24. Cómo usar @autowire en beans administrados jsf
- 25. Atributos de ensamblados de C++ administrados
- 26. Mover frijoles administrados JSF a Spring beans
- 27. Inicializador de objetos para colecciones de objetos
- 28. ¿Reutilizar objetos existentes para objetos inmutables?
- 29. referencias débiles y objetos desechables
- 30. ¿Transacciones para objetos C#?
¿Cómo espera que el recolector de basura recopile objetos no administrados? – dtb
@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. –
@dtb: recopilando el objeto gestionado que lo posee. – Puppy