Cara mendapatkan memori yang tersedia atau digunakan di C #

141

Bagaimana saya bisa mendapatkan RAM atau memori yang tersedia yang digunakan oleh aplikasi?

johnnyRose
sumber
Anda harus melihat System.Diagnostics.Processkelasnya.
Ronald Wildenberg
3
Catatan, RAM fisik yang saat ini digunakan adalah set yang berfungsi, memori yang dialokasikan termasuk dalam byte pribadi atau bersama (tergantung pada jenis alokasi).
Richard

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 .

Jesper Fyhr Knudsen
sumber
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.

Christian C. Salvadó
sumber
13
Hanya dalam tumpukan terkelola. Jawaban Arkain harus memberikan tumpukan asli dan terkelola.
Yaur
25

System.Environment memiliki WorkingSet - bilangan bulat 64-bit yang berisi jumlah byte memori fisik yang dipetakan ke konteks proses.

Jika Anda menginginkan banyak detail, ada System.Diagnostics.PerformanceCounter , tetapi penyiapannya akan sedikit lebih sulit.

Austin
sumber
Dapatkah Anda (atau seseorang sama sekali) memberikan contoh cara menggunakan PerformanceCounter untuk mendapatkan memori yang tersedia / digunakan sistem?
Elemental of Creation
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 .

DevT
sumber
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.

Ahmad Payan
sumber
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();
PodTech.io
sumber