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.