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
per raccogliere i rifiuti da dove –
da qualche processo che voglio forzare GC..?. per alcuni diagnostici. Non fa parte del mio codice. – Kamarey
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