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


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 .


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.


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


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 .


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.


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();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.