Comment obtenir de la mémoire disponible ou utilisée en C #

136

Comment puis-je obtenir la RAM disponible ou la mémoire utilisée par l'application?

johnnyRose
la source
Vous devriez jeter un œil à la System.Diagnostics.Processclasse.
Ronald Wildenberg
3
Notez que la RAM physique actuellement utilisée est l'ensemble de travail, la mémoire allouée tombe en octets privés ou partagés (selon le type d'allocation).
Richard

Réponses:

172

Vous pouvez utiliser:

Process proc = Process.GetCurrentProcess();

Pour obtenir le processus actuel et utiliser:

proc.PrivateMemorySize64;

Pour obtenir l'utilisation de la mémoire privée. Pour plus d'informations, consultez ce lien .

Jesper Fyhr Knudsen
la source
52
Il faut probablement noter qu'un appel à GetCurrentProcess allouera lui-même pas mal de ressources. Appelez Dispose sur le processus retourné une fois terminé, ou enveloppez le code entier dans une portée "using".
Mathias Lykkegaard Lorenzen
9
Espace de noms: System.Diagnostics Assembly: System (dans System.dll)
Enigma Plus
12
Je voudrais également ajouter que la propriété PrivateMemorySize64 (+ autres propriétés) elle-même n'est pas automatiquement mise à jour jusqu'à ce que Refresh () soit appelée. (Il est mentionné sur la page au lien ci-dessus.)
ScottRhee
1
Voir cette autre question similaire pour plus de réponses: stackoverflow.com/questions/14032515/…
Aaron D
1
@ScottRhee corrige-moi si je me trompe - mais j'ajouterais que les valeurs de propriété sont "à jour" au moment où vous appelez GetCurrentProcess, mais n'ont besoin d'être actualisées que si vous effectuez d'autres opérations avant d'accéder aux propriétés. Source - Les remarques indiquent que les propriétés sont correctes au moment de la création de l'instantané de processus.
tabjsina
38

Vous souhaiterez peut-être vérifier la méthode GC.GetTotalMemory .

Il récupère le nombre d'octets actuellement censés être alloués par le garbage collector.

CMS
la source
12
Seulement dans les tas gérés cependant. La réponse d'Arkain devrait donner à la fois des tas natifs et gérés.
Yaur
25

System.Environment a WorkingSet - un entier signé 64 bits contenant le nombre d'octets de mémoire physique mappés au contexte de processus.

Si vous voulez beaucoup de détails, il y a System.Diagnostics.PerformanceCounter , mais la configuration demandera un peu plus d'efforts.

Austin
la source
Pouvez-vous (ou quelqu'un du tout) donner un exemple de la manière d'utiliser PerformanceCounter pour obtenir la mémoire disponible / utilisée du système?
L'élémentaire de la création
11

Regardez ici pour plus de détails.

private PerformanceCounter cpuCounter;
private PerformanceCounter ramCounter;
public Form1()
{
    InitializeComponent();
    InitialiseCPUCounter();
    InitializeRAMCounter();
    updateTimer.Start();
}

private void updateTimer_Tick(object sender, EventArgs e)
{
    this.textBox1.Text = "CPU Usage: " +
    Convert.ToInt32(cpuCounter.NextValue()).ToString() +
    "%";

    this.textBox2.Text = Convert.ToInt32(ramCounter.NextValue()).ToString()+"Mb";
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void InitialiseCPUCounter()
{
    cpuCounter = new PerformanceCounter(
    "Processor",
    "% Processor Time",
    "_Total",
    true
    );
}

private void InitializeRAMCounter()
{
    ramCounter = new PerformanceCounter("Memory", "Available MBytes", true);

}

Si vous obtenez la valeur 0, il doit appeler NextValue()deux fois. Ensuite, il donne la valeur réelle de l'utilisation du processeur. Voir plus de détails ici .

DevT
la source
6

En plus de @JesperFyhrKnudsen « s de réponse et @MathiasLykkegaardLorenzen » s commentaire, vous feriez mieux de disposele retournéProcess après l' avoir utilisé.

Ainsi, pour supprimer le Process, vous pouvez l'envelopper dans une usingportée ou appeler Disposele processus retourné ( procvariable).

  1. using portée:

    var memory = 0.0;
    using (Process proc = Process.GetCurrentProcess())
    {
        // The proc.PrivateMemorySize64 will returns the private memory usage in byte.
        // Would like to Convert it to Megabyte? divide it by 2^20
           memory = proc.PrivateMemorySize64 / (1024*1024);
    }
  2. Ou Disposeméthode:

    var memory = 0.0;
    Process proc = Process.GetCurrentProcess();
    memory = Math.Round(proc.PrivateMemorySize64 / (1024*1024), 2);
    proc.Dispose();

Vous pouvez maintenant utiliser la memoryvariable qui est convertie en mégaoctet.

Ahmad Payan
la source
3
NB: Un mégaoctet
équivaut à
1
Une note. En C #, ^c'est XOR au niveau du bit, pas de puissance. Alors utilisez simplement proc.PrivateMemorySize64 / (1024*1024), ouproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков
Vous avez manqué les parenthèses, proc.PrivateMemorySize64 / (1024 * 1024)car la multiplication n'a pas de priorité sur la division.
Laurynas Lazauskas le
@LaurynasLazauskas J'ai mis à jour la réponse. Merci.
Ahmad Payan le
0

Pour le système complet, vous pouvez ajouter le Microsoft.VisualBasic Framework comme référence;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
PodTech.io
la source