2010-08-29 15 views
11

¿Es posible ejecutar el recolector de elementos no utilizados de .NET desde la línea de comandos, p. sin escribir código?¿Ejecutar el recolector de elementos no utilizados desde la línea de comandos?

Editar:

Cuando se le preguntó esta pregunta, quería decir exactamente lo que pidió aquí para Java recolector de basura:

How to request JVM garbage collection (not from code) when run from Windows command-line

Así que si hay una manera de hacer esto en JVM, no ven ninguna razón no existiría en .NET

+5

para recoger la basura desde donde –

+2

de algún proceso quiero forzar GC..?. para algunos diagnósticos. No es parte de mi código. – Kamarey

+0

Us Respuesta eless: dentro de PowerShell ejecuta '[gc] :: Collect (0)' para ejecutar una colección gen 0 en el proceso. Pero, ¿por qué querría uno hacer esto? – Richard

Respuesta

22

Existe una opción, aunque no tengo idea de si eso es "seguro para la producción". Es decir, no sé qué tan alto es el riesgo, que el proceso objetivo se cuelga. Pero si se usa para la resolución de problemas y/o análisis, puede ser útil.

Puede utilizar PerfView con el propósito:

PerfView.exe ForceGC [ProcessName | Process ID] 

O citar el PerfView.exe /? de salida:

... Uso: PerfView ForceGC Proceso

Fuerza una GC en el proceso especificado

Parámetros: Proceso El ID del proceso o Nombre del proceso (Exe sin extensión) del proceso para forzar un GC. ...

El "problema" es que aquí, que esto va a abrir una nueva ventana de consola y, después de que se hace esto, le pedirá que cerrar esta ventana.

PerfView.exe, sin embargo, volcará una gran cantidad de ejecutables en %APPDATA%\PerfView\_version_ que se empaquetan dentro del ejecutable PerfView.exe como recursos.

Así, una vez que se ha ejecutado el comando PerfView.exe, puede invocar la herramienta HeapDump.exe manualmente (en mi caso el cuadro de x64 y con el ID de proceso 15396):

cd C:\Users\MyUserName\AppData\Roaming\PerfView\VER.2014-02-04.09.06.52.000\AMD64 
HeapDump.exe /ForceGC 15396 

Ejemplo de salida será similar a:

Loading the ETWClrProfiler. 
Turning on debug privilege. 
Highest Runtime in process is version v4.0.30319 
    0,0s: Trying to attach a profiler. 
    0,1s: Done Attaching ETLClrProfiler ret = 0 
Attached ETWClrProfiler. 
    0,1s: Enabling JScript Heap Provider 
    0,1s: Enabling EtwClrProfiler 
    0,1s: Enabling CLR GC events 
    0,1s: Requesting a JScript GC 
    0,1s: Requesting a DotNet GC 
    4,0s: .NET GC Starting at 0,15s. 
    4,0s: .NET GC stats, at 0,16s Survived 2221152. 
    6,0s: .NET GC complete at 0,17s. 
    6,0s: Triggered .NET GC, No JScript heap detected 
    6,1s: Requesting ETWClrProfiler unload. 
    6,1s: Shutting down ETW session 
[ 6,1s: Done forcing GCs success=True] 

Tenga en cuenta que lo anterior es AFAIK uso no oficial de la herramienta y puede dejar de funcionar con nuevas versiones. Y, por supuesto, PerfView puede hacer mucho más que solo forzar un GC (inicie here).

Internamente, los usos anteriores, la ICorProfilerInfo::ForceGC interfaz de perfiles/método que viene con el CLR (source. Escribir una herramienta "simple"/"independiente" para ese propósito es, pues, no está completamente fuera de la cuestión. Tarea no trivial no la . menos

actualización: PerfView como tal es ahora open source y la herramienta anterior hablaba de is part of it En caso de que usted es curioso

+0

¡Increíble! Thansk mucho –

+0

Intentar hacer esto en ASP.NET está dando como resultado una "System.UnauthorizedAccessException: acceso denegado". en 'ICLRProfiling.AttachProfiler' – DannyMeister

+0

@DannyMeister asegúrese de tener los permisos apropiados para hacerlo (el usuario que ejecuta perfview.exe contra el usuario que ejecuta IIS). –

10

El recolector de basura se ejecuta dentro de un proceso. Por lo tanto, si desea ejecutar el recolector de elementos no utilizados para este proceso, puede probar el método GC.Collect. No puede forzar la recolección de basura para un proceso dado desde el exterior.

También tenga en cuenta que forzar la recolección de basura (utilizando el método GC.Collect) es considered as bad practice y debe evitarse.


No existe una herramienta de Microsoft y nunca he oído hablar de ninguna herramienta de terceros capaz de hacer esto. Cada proceso obtiene sus propios montones de GC, y por lo tanto sus propios subprocesos GC, por lo que forzar una Recolección GC en otro proceso, AFAIK, es imposible.

+0

Gracias, pero como le pregunté en la pregunta: "sin escribir código". Supongo que hay alguna herramienta, que pueda llamar desde línea de comandos para algún proceso específico. Lo siento, tu respuesta no es relevante. – Kamarey

+0

@Kamarey, no existe una herramienta de Microsoft (y dudo que exista una herramienta de terceros). Cada proceso obtiene sus propios montones de GC, y por lo tanto sus propios hilos GC, por lo que forzar una Recolección GC en otro proceso , hasta donde yo sé, es imposible. –

+8

@ Kamarey, ¿cómo no es relevante decir que no se puede hacer y darle la razón? –

Cuestiones relacionadas