2010-08-29 7 views
11

Est-il possible d'exécuter .NET garbage collector à partir de la ligne de commande, par ex. sans écrire de code?Exécuter garbage collector à partir de la ligne de commande?

Edit:

Lorsqu'on a posé cette question, je voulais dire exactement ce que demande ici pour Java garbage collector:

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

Donc, s'il y a un moyen de le faire dans JVM, ne vois aucune raison il n'existe pas dans .NET

+5

pour ramasser les ordures d'où –

+2

de certains processus, je veux forcer GC..?. pour certains diagnostics.Il ne fait pas partie de mon code – Kamarey

+0

eless answer: dans PowerShell, lancez [gc] :: Collect (0) 'pour lancer une collection gen 0 dans le processus. Mais pourquoi voudrait-on faire ça? – Richard

Répondre

22

Il existe une option, bien que je ne sache pas si c'est "production sûre". Autrement dit, je ne sais pas à quel point le risque est élevé, que le processus cible se bloque. Mais s'il est utilisé pour le dépannage et/ou l'analyse, il pourrait être utile.

Vous pouvez utiliser PerfView dans le but:

PerfView.exe ForceGC [ProcessName | Process ID] 

Ou pour citer la sortie PerfView.exe /?:

... Utilisation: PerfView ForceGC processus

Force une GC sur le processus spécifié

Paramètres: Processus L'ID de processus ou nom de processus (Exe sans extension) du processus pour forcer un GC. ...

Le « problème » est ici, que cela va ouvrir une nouvelle fenêtre de la console et, après cela est fait, vous invite à fermer cette fenêtre. Perfiew.exe va cependant vider un grand nombre d'exécutables à %APPDATA%\PerfView\_version_ qui sont emballés dans l'exécutable PerfView.exe en tant que ressources.

Ainsi, une fois que vous avez exécuté la commande PerfView.exe, vous pouvez appeler l'outil HeapDump.exe manuellement (dans mon cas sur la boîte x64 et processus ID 15396):

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

Exemple de sortie ressemble à:

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] 

Veuillez noter que ce qui précède est AFAIK l'utilisation non officielle de l'outil et pourrait cesser de fonctionner avec les nouvelles versions. Et, bien sûr, PerfView peut faire beaucoup plus que simplement forcer un GC (démarrer here).

En interne, l'utilise au-dessus de l'interface de profilage ICorProfilerInfo::ForceGC/méthode qui vient avec le CLR (source. L'écriture d'un outil « plus simple »/« autonome » à cette fin est donc pas totalement hors de question. Tâche non triviale jamais . moins

Mise à jour: PerfView en tant que telle est maintenant open source et l'outil a parlé ci-dessus is part of it Si vous êtes curieux

+0

Incroyable! Thansk beaucoup –

+0

Essayer de faire cela dans ASP.NET se traduit par une "System.UnauthorizedAccessException: Accès refusé". dans 'ICLRProfiling.AttachProfiler' – DannyMeister

+0

@DannyMeister assurez-vous que vous avez les permissions appropriées pour le faire (l'utilisateur exécutant perfview.exe par rapport à l'utilisateur exécutant IIS). –

10

Le garbage collector s'exécute à l'intérieur d'un processus. Donc, si vous voulez exécuter le garbage collector pour ce processus, vous pouvez essayer la méthode GC.Collect. Vous ne pouvez pas forcer la récupération de place pour un processus donné de l'extérieur.

Notez également que forcer la récupération de place (en utilisant la méthode GC.Collect) est considered as bad practice et doit être évitée.


Il n'existe aucun outil Microsoft et je n'ai jamais entendu parler d'un outil tiers capable de le faire. Chaque processus obtient ses propres tas GC, et donc ses propres threads GC, forçant ainsi une collection GC sur un autre processus, AFAIK, est impossible.

+0

Merci, mais comme je l'ai demandé dans la question: "sans écrire le code". Je suppose qu'il existe un outil, que je peux appeler à partir de la ligne de commande pour un processus spécifique. Donc désolé, votre réponse n'est pas pertinente. – Kamarey

+0

@Kamarey, il n'y a pas d'outil Microsoft (et je doute qu'un outil tiers existe). Chaque processus obtient ses propres tas GC, et donc ses propres threads GC, forçant ainsi une collection GC sur un autre processus, autant que je sache, est impossible. –

+8

@Kamarey comment est-ce que ce n'est pas pertinent de dire non cela ne peut pas être fait et vous donner la raison? –

3

JetBrains dotTrace vous permet d'invoquer la collecte des ordures lorsque vous êtes attaché à un processus et la capture d'une trace. Donc, il y a un moyen ... http://www.jetbrains.com/profiler/

Questions connexes