Cara mendapatkan memori yang tersedia atau digunakan di C #


Jawaban:


174

Kamu bisa memakai:

Process proc = Process.GetCurrentProcess();

Untuk mendapatkan proses dan penggunaan saat ini:

proc.PrivateMemorySize64;

Untuk mendapatkan penggunaan memori pribadi. Untuk informasi lebih lanjut, lihat tautan ini .


52
Mungkin harus dicatat bahwa panggilan ke GetCurrentProcess akan mengalokasikan cukup banyak resource. Panggil Buang pada proses yang dikembalikan setelah selesai, atau bungkus seluruh kode dalam lingkup "menggunakan".
Mathias Lykkegaard Lorenzen

9
Namespace: System.Diagnostics Assembly: System (dalam System.dll)
Enigma Plus

13
Saya juga ingin menambahkan bahwa properti PrivateMemorySize64 (+ properti lain) itu sendiri tidak diperbarui secara otomatis hingga Refresh () dipanggil. (Disebutkan pada halaman pada tautan di atas.)
ScottRhee

1
Lihat pertanyaan serupa lainnya ini untuk jawaban lebih lanjut: stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee mengoreksi saya jika saya salah - tetapi saya akan menambahkan bahwa nilai properti "terbaru" pada saat Anda menelepon GetCurrentProcess, tetapi hanya perlu di-refresh jika Anda melakukan operasi lain sebelum mengakses properti. Sumber - Komentar mengatakan properti sudah benar pada saat snapshot proses dibuat.
tabjsina

38

Anda mungkin ingin memeriksa metode GC.GetTotalMemory .

Ini mengambil jumlah byte yang saat ini dianggap dialokasikan oleh pengumpul sampah.


13
Hanya dalam tumpukan terkelola. Jawaban Arkain harus memberikan tumpukan asli dan terkelola.
Yaur


11

Lihat di sini untuk detailnya.

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);

}

Jika Anda mendapatkan nilai 0 itu perlu memanggil NextValue()dua kali. Kemudian memberikan nilai sebenarnya dari penggunaan CPU. Lihat detail selengkapnya di sini .


7

Selain @JesperFyhrKnudsen 's jawaban dan @MathiasLykkegaardLorenzen komentar' s, Anda sebaiknya disposedikembalikanProcess setelah menggunakannya.

Jadi, Untuk membuang Process, Anda dapat membungkusnya dalam sebuah usinglingkup atau memanggil Disposeproses yang dikembalikan ( procvariabel).

  1. using cakupan:

    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. Atau Disposemetode:

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

Sekarang Anda bisa menggunakan memoryvariabel yang diubah menjadi Megabyte.


3
NB: Satu megabyte adalah 2 ^ 20 bukan 1e + 6
Hylaean

2
Satu catatan. Dalam C # ^adalah XOR bitwise, bukan daya. Jadi gunakan saja proc.PrivateMemorySize64 / (1024*1024), atauproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

Anda melewatkan tanda kurung, proc.PrivateMemorySize64 / (1024 * 1024)karena perkalian tidak memiliki prioritas di atas pembagian.
Laurynas Lazauskas

@LaurynasLazauskas Saya telah memperbarui jawabannya. Terima kasih.
Ahmad Payan

0

Untuk sistem lengkap Anda dapat menambahkan Kerangka Microsoft.VisualBasic sebagai referensi;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.