2010-06-21 16 views
12

Cuando depuro el código .net, ¿cómo puedo saber cuándo se ejecuta el recolector de elementos no utilizados?¿Cuándo se ejecuta el recolector de basura .net?

No deseo controlar cuándo se ejecuta el recolector de basura. Solo deseo poder saber cuándo se está ejecutando. Tengo un código que se está quedando sin recursos. Sé que los recursos no están siendo utilizados; Quiero saber cuándo se está ejecutando el GC para liberarlos.

Ah, y los recursos que tengo en mente son las conexiones desde un pool de conexiones SQL, no en la memoria :-)

+1

¿Por qué necesita saber cuándo funciona? –

+0

El recolector de basura solo recopila (por definición) basura, es decir, objetos a los que ya no hace referencia el programa. – Ken

+8

Hacer esta pregunta es como preguntarle a un jefe de la mafia cuándo está programado que llegue su próximo envío de droga. La respuesta es 'ninguno de tus negocios' seguido de una firme :: smack :: en la parte posterior de la cabeza :) –

Respuesta

5

Tienes que usar .NET 4.0, lo que estás pidiendo no es compatible con versiones anteriores.

Básicamente, llama a los métodos WaitForFullGCApproach y WaitForFullGCComplete en un bucle. WaitForFullGCApproach bloqueará hasta que vea un GC, WaitForFullGCCompleto se bloqueará hasta que se complete el GC.

Lea este artículo detenidamente. Si usa este método, entonces usted es responsable de asegurarse de que la recolección de basura ocurra realmente. Si lo estropea, podría romper el GC y rápidamente quedarse sin memoria.

http://msdn.microsoft.com/en-us/library/cc713687.aspx

9

Usted no debe, en general, nunca preocuparse o pensar acerca de cuando se ejecuta la GC.

El recolector de basura se ejecutará según sea necesario, en un tiempo indeterminado elegido por el tiempo de ejecución.

Si desea un control del grano más fino sobre el GC (que no recomiendo excepto en circunstancias muy específicas), puede usar GC.AddMemoryPressure y GC.RemoveMemoryPressure. Esto no forzará la ejecución del GC, sino que insinuará que hay otra memoria en funcionamiento además de la memoria administrada asignada por CLR. Esto potencialmente hará que se ejecute con más frecuencia, lo que puede ser útil si está asignando grandes bloques de memoria en el código nativo.

No hay una API directa para realizar un seguimiento de las ejecuciones de GC. (Por ejemplo, la clase GC no contiene ningún evento que notifique la recolección de basura). La única forma directa de saber, específicamente, cuándo se está ejecutando el GC es usar el profiling API.

+0

He encontrado documentación que indica que .net realiza un seguimiento de la memoria y optimiza las carreras de GC basadas en eso. ¿Eso significa que estoy fuera de combate si necesito que GC se ejecute para conexiones gratuitas a un servidor SQL? –

+0

@Rising Star: No. Una conexión SQL es un problema separado de la memoria. Puede cerrarlo manualmente a través de conn.Close(): http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx –

+0

Hrm ... ¿Por qué el downvoting aquí? –

1

En .NET framework, GarbageCollector lo ejecuta.

Con toda seriedad, .Net está configurado para optimizar GC. Puede ocurrir al final de una llamada a un método, o puede funcionar por un día sin necesidad de ser GC. ¿Hay alguna razón específica por la que necesita saber cuándo se recopila?

2

Siempre que se siente como que

El recolector de basura .NET es un generational garbage collector. Definitivamente hay un método para la locura, pero no es exactamente algo que puedas predecir con precisión.

3

recolección de basura no libera las conexiones de bases de datos agrupados. las conexiones se devuelven al grupo cuando cierra/elimina el objeto de conexión. el grupo de conexiones se administra cuando necesita abrir más conexiones y volver a cerrarlas en función de la fuerza con la que esté golpeando su grupo y la configuración del grupo en la cadena de conexión. la recolección de basura no está relacionada con esto de ninguna otra manera que no sea recuperar la memoria asignada a las instancias de SqlConnection. estás ladrando al árbol equivocado al preguntar sobre la recolección de basura y obtener (y aceptar) respuestas que no tienen nada que ver con lo que buscas (si entiendo tu pregunta correctamente).

0

Dos de las principales razones por las que GC se ejecuta son a) si la generación 0 está llena b) cuando el montón está lleno. cortesía - CLR Via C#, Jeffrey Richter

Cuestiones relacionadas