2010-08-29 19 views
11

È possibile eseguire Garbage Collector .NET dalla riga di comando, ad es. senza scrivere codice?Eseguire Garbage Collector dalla riga di comando?

Edit:

Quando è stato chiesto a questa domanda, volevo dire esattamente ciò che ha chiesto qui per Java garbage collector:

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

Quindi, se c'è un modo per fare questo in JVM, vedono alcuna ragione non esisterebbe in .NET

+5

per raccogliere i rifiuti da dove –

+2

da qualche processo che voglio forzare GC..?. per alcuni diagnostici. Non fa parte del mio codice. – Kamarey

+0

Us risposta eless: all'interno di PowerShell eseguire '[gc] :: Collect (0)' per eseguire una raccolta gen 0 nel processo. Ma perché uno vorrebbe farlo? – Richard

risposta

22

C'è un'opzione, anche se non ho idea se si tratta di "produzione sicura". Cioè, non so quanto sia alto il rischio, che il processo di destinazione si arresti. Ma se usato per la risoluzione dei problemi e/o analisi potrebbe tornare utile.

È possibile utilizzare PerfView allo scopo:

PerfView.exe ForceGC [ProcessName | Process ID] 

O per citare dal PerfView.exe /? uscita:

... Usage: PerfView ForceGC processo

Forza un GC su il processo specificato

Parametri: Processo L'ID processo o Nome processo (Exe senza estensione) del processo per forzare a GC. ...

Il "problema" è qui, che questo aprirà una nuova finestra della console e, dopo che è stato fatto, si chiederà di chiudere questa finestra.

PerfView.exe eseguirà comunque il dump di una serie di eseguibili su %APPDATA%\PerfView\_version_ che sono impacchettati all'interno dell'eseguibile PerfView.exe come risorse.

Quindi, una volta che è stato eseguito il comando PerfView.exe, è possibile richiamare lo strumento HeapDump.exe manualmente (nel mio caso sulla scatola x64 e con ID di processo 15396):

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

uscita Esempio assomiglia:

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] 

Si prega di notare che quanto sopra è AFAIK uso non ufficiale dello strumento e potrebbe smettere di lavorare con le nuove versioni. E, naturalmente, PerfView può fare molto di più che forzare un GC (start here).

Internamente, quanto sopra utilizza la ICorProfilerInfo::ForceGC interfaccia di profilatura/metodo che viene fornito con il CLR (source. Scrivi/funzione "semplice" "standalone" a tale scopo quindi non è del tutto fuori questione. Compito non banale mai . meno

Aggiornamento: PerfView come tale è ora open source e lo strumento ha parlato di sopra is part of it Nel caso foste curiosi

+0

Incredibile! Grazie mille –

+0

Provare a fare ciò in ASP.NET si traduce in un "System.UnauthorizedAccessException: Accesso negato." in 'ICLRProfiling.AttachProfiler' – DannyMeister

+0

@DannyMeister assicurarsi di disporre delle autorizzazioni appropriate per farlo (l'utente che esegue perfview.exe rispetto all'utente che esegue IIS). –

10

Il garbage collector viene eseguito all'interno di un processo. Quindi se vuoi eseguire il garbage collector per questo processo puoi provare il metodo GC.Collect. Non è possibile forzare la garbage collection per un determinato processo dall'esterno.

Si noti inoltre che forzare la garbage collection (utilizzando il metodo GC.Collect) è considered as bad practice e deve essere evitato.


Non esiste uno strumento Microsoft e non ho mai sentito di alcuno strumento di terze parti in grado di farlo. Ogni processo ottiene i propri heap GC e quindi i propri thread GC, quindi forzare una raccolta GC su un altro processo, AFAIK, è impossibile.

+0

Grazie, ma come ho chiesto nella domanda: "senza scrivere codice". Presumo che ci sia uno strumento, che posso chiamare dalla riga di comando per qualche processo specifico. Mi dispiace, la tua risposta non è pertinente. – Kamarey

+0

@Kamarey, non esiste uno strumento Microsoft (e dubito che esista uno strumento di terze parti). Ogni processo ha i propri heap GC e quindi i propri thread GC, quindi forzare una raccolta GC su un altro processo , per quanto ne so, è impossibile. –

+8

@Kamarey come non è rilevante affermare che non può essere fatto e dandoti il ​​motivo? –

3

JetBrains dotTrace permette di richiamare la raccolta dei rifiuti quando sei collegato a un processo e catturare una traccia di esso. Quindi c'è un modo ... http://www.jetbrains.com/profiler/

Problemi correlati