2009-01-29 9 views

Respuesta

18

Un recurso administrado es otro tipo gestionado, que implementa IDisposable. Debe llamar al Dispose() en cualquier otro tipo de IDisposable que use. recursos nativos son nada fuera del mundo gestionada como nativo de Windows maneja etc.


EDITAR: Respuesta a la pregunta en el comentario (demasiado tiempo para hacer comentarios)

No es que sólo un tipo administrado. Un tipo de construcción correcta, que no implementa IDisposable será manejado por el recolector de basura y no tiene que hacer nada más. Si su tipo utiliza un recurso nativo directamente (por ejemplo, llamando a bibliotecas Win32), debe implementar IDisposable en su tipo y disponer de los recursos en el método Dispose. Si su tipo utiliza un recurso nativo encapsulado por otro tipo que implementa IDisposable, debe llamar al Dispose() en instancias de este tipo en el método Dispose de su tipo.

+0

Así que es un tipo administrado que no implementa IDisposable un recurso no administrado? Tal vez estoy confundido por el recurso tipo versos ... –

+0

@Yooder: ¿Cómo se puede tener un recurso administrado que no está representado por un tipo? –

+0

@LarryFix: Diferentes personas usan la terminología de manera diferente, pero yo diría que un objeto que no ha pedido * otra cosa * que haga algo en su nombre, hasta nuevo aviso, y en detrimento de otros, no contiene * ningún * recursos. – supercat

21

Para añadir un poco a la respuesta de Brian, y su comentario/pregunta:

La diferencia entre un recurso gestionado/no administrado es que el recolector de basura es consciente de los recursos gestionados y no tiene conocimiento de los recursos no administrados. Sé que la respuesta no es muy concreta, pero la diferencia es enorme.

Para ayudar a dibujar la línea en la arena aquí es la versión corta (y probablemente plagado de pequeños errores) de cómo se ejecuta GC y se limpia la memoria:

colector

La basura es consciente de todos los objetos gestionados embargo, cuando la basura la colección se ejecuta inicialmente no sabe si un objeto dado todavía está en uso o es elegible para ser lanzado. Determina si puede o no limpiar un objeto marcando inicialmente todos los objetos como basura y luego atravesando desde la raíz de la aplicación hasta todos los objetos a los que se hace referencia. Cada objeto que tiene una relación con la raíz (una referencia, ya sea directa o indirecta) se marca como alcanzable y ya no se considera basura. Después de que el GC recorre todos los objetos alcanzables, limpia el resto ya que no están en uso.

En casi todos los casos que trabaje con objetos de .NET Framework, puede estar seguro de que los objetos se administran (.NET proporciona envoltorios administrados de casi todos los recursos no administrados para garantizar que se limpien adecuadamente); otros componentes de terceros que se conectan a la API de Win32 (o sus componentes que hacen esto) son los objetos que pueden ser motivo de preocupación.

Hay algunos objetos .NET que se pueden considerar algo no administrados. Los componentes de la biblioteca de gráficos son un ejemplo.

La mayoría de las "Fugas de memoria .NET" no son realmente fugas de memoria en el verdadero sentido. Normalmente ocurren cuando piensa que ha eliminado un objeto del uso, pero de hecho el objeto todavía tiene alguna referencia a la aplicación. Un ejemplo común es agregar eventhandlers (obj.SomeEvent + = OnSomeEvent -o bien - AddHandler obj.SomeEvent, AddressOf OnSomeEvent) y no eliminarlos.

Estas 'referencias persistentes' técnicamente no son pérdidas de memoria ya que su aplicación todavía las está utilizando técnicamente; sin embargo, si hay suficientes, su aplicación puede sufrir graves impactos en el rendimiento y puede mostrar signos de problemas de recursos (OutOfMemoryExceptions, no se pueden obtener identificadores de ventanas, etc.).

Soy un desarrollador intermedio de .NET y desafortunadamente conozco estos problemas de primera mano. Recomiendo jugar con ANTS Profiler para familiarizarse con las referencias persistentes (hay una versión de prueba gratuita) o si quieres obtener un poco más de investigación con WinDbg y SOS.DLL para ver el montón administrado. Si decides ver lo último, te recomiendo leer el blog de Tess Ferrandez; tiene una gran cantidad de excelentes tutoriales y consejos sobre el uso eficaz de Windb.

+3

Me gusta tu respuesta.La distinción más importante entre los recursos administrados y no administrados no es si existen dentro del mundo GC, sino si el GC sabrá cómo hacer toda la limpieza necesaria si se abandonan. Si no se limpia algo, puede afectar la funcionalidad del sistema, pero un GC de nivel 2 se ocupará de él, es un recurso administrado. Si no se puede limpiar algo puede perjudicar la funcionalidad del sistema, e incluso los repetidos GC de nivel 2 no ayudarán, es un recurso no administrado. – supercat

1

La respuesta breve sería cualquier cosa que vaya detrás de la CLR (al SO) para obtener se puede llamar 'nativo'.

  • asignación de memoria no administrada. Si 'nuevo' sube un trozo de memoria en una clase administrada CantStayManaged, entonces CantStayManaged es responsable de liberar esta memoria (recurso).
  • maneja a los archivos, tuberías, eventos, construcciones de sincronización, etc. - Como regla general, si usted llama WinAPIs obtener punteros/asas para un recurso, entonces esos son '' los recursos nativos

Así que ahora CantStayManaged tiene 2 cosas que necesita para limpiar antes de decir adiós.

  1. Administrado: campos de miembros y cualquier recurso asignado por el CLR. Esto generalmente equivale a llamar a Dispose en sus objetos miembros 'Desechables'.
  2. No administrado: todas las cosas furtivas de bajo nivel que ponemos detrás de su espalda.

Hay 2 maneras en que se puede activar la limpieza de objetos ahora.

(verdadero) caso
  1. Desechar: Desechar Usted llama explícitamente en su tipo. Buen programador.
  2. Dispose (false) case: Olvidó llamar a Dispose, en cuyo caso el finalizador debería activarse y aún así garantizar una limpieza adecuada.

En ambos casos, los recursos no administrados deberían liberarse arriba si no '¡FUGAS!', '¡CRASH!' et.all superficie. Pero solo debe intentar limpiar los recursos administrados solo en el caso anterior Dispose(). En este último caso/finalizador, el CLR podría haber finalizado y recopilado algunos de sus miembros, por lo que no debería acceder a ellos (CLR no garantiza un orden en el que finalice un gráfico de objetos). De ahí que evite problemas por la protección de su limpieza conseguido con un cheque if (AmIBeingCalledFromDispose) guardia

HTH

+0

Si bien los recursos nativos que se mantienen directamente son recursos no administrados, es posible tener recursos no administrados completamente dentro del código administrado. Un objeto que contiene un "recurso" es aquel que ha pedido algo diferente a algo que hacer en su nombre, hasta nuevo aviso, en detrimento potencial de otros. Un recurso que no será limpiado adecuadamente por el GC si se abandona es un recurso no administrado. – supercat

Cuestiones relacionadas