Cách nhận bộ nhớ khả dụng hoặc được sử dụng trong C #


136

Làm cách nào tôi có thể nhận được RAM hoặc bộ nhớ khả dụng mà ứng dụng sử dụng?


Bạn nên xem qua System.Diagnostics.Processlớp học.
Ronald Wildenberg

3
Lưu ý, RAM vật lý hiện đang được sử dụng là bộ làm việc, bộ nhớ được phân bổ rơi vào byte riêng hoặc chia sẻ (tùy thuộc vào loại phân bổ).
Richard

Câu trả lời:


172

Bạn có thể dùng:

Process proc = Process.GetCurrentProcess();

Để có được quy trình hiện tại và sử dụng:

proc.PrivateMemorySize64;

Để có được việc sử dụng bộ nhớ riêng. Để biết thêm thông tin nhìn vào liên kết này .


52
Có lẽ nên lưu ý rằng một cuộc gọi đến GetCienProcess sẽ tự phân bổ khá nhiều tài nguyên. Gọi Vứt bỏ quá trình trả về khi hoàn tất hoặc bọc toàn bộ mã trong phạm vi "sử dụng".
Mathias Lykkegaard Lorenzen

9
Không gian tên: System.Diagnostics hội: System (in System.dll)
Enigma Plus

12
Tôi cũng muốn thêm rằng thuộc tính PrivateMemorySize64 (+ các thuộc tính khác) không được cập nhật tự động cho đến khi được làm mới (). (Nó được đề cập trên trang ở đường dẫn trên.)
ScottRhee

1
Xem câu hỏi tương tự khác này để biết thêm câu trả lời: stackoverflow.com/questions/14032515/ cấp
Aaron D

1
@ScottRhee sửa lỗi cho tôi nếu tôi sai - nhưng tôi thêm rằng các giá trị thuộc tính "cập nhật" tại thời điểm bạn gọi GetCurrentProcess, nhưng chỉ cần được làm mới nếu bạn đang thực hiện các thao tác khác trước khi truy cập các thuộc tính. Nguồn - Nhận xét cho biết các thuộc tính là chính xác tại thời điểm ảnh chụp nhanh quá trình được tạo.
tabjsina

38

Bạn có thể muốn kiểm tra phương thức GC.GetTotalMemory .

Nó lấy ra số byte hiện được cho là do trình thu gom rác phân bổ.


12
Chỉ trong đống được quản lý mặc dù. Câu trả lời của Arkain sẽ cung cấp cho cả đống bản địa và quản lý.
Yaur

25

System.En Môi trườngWorkset - số nguyên có chữ ký 64 bit chứa số byte bộ nhớ vật lý được ánh xạ tới bối cảnh quy trình.

Nếu bạn muốn có nhiều chi tiết thì có System.Diagnostics.PerformanceCorer , nhưng sẽ cần thêm một chút nỗ lực để thiết lập.


Bạn có thể (hoặc ai đó) đưa ra một ví dụ về cách sử dụng PerformanceCorer để có được hệ thống có sẵn / bộ nhớ đã sử dụng không?
Nguyên tố sáng tạo

11

Nhìn vào đây để biết chi tiết.

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

}

Nếu bạn nhận được giá trị là 0, nó cần gọi NextValue()hai lần. Sau đó, nó cung cấp giá trị thực tế của việc sử dụng CPU. Xem thêm chi tiết tại đây .


6

Ngoài @JesperFyhrKnudsen 's câu trả lời và @MathiasLykkegaardLorenzen bình luận' s, bạn muốn tốt hơn disposenhững trởProcess sau khi sử dụng nó.

Vì vậy, để loại bỏ Process, bạn có thể gói nó trong một usingphạm vi hoặc gọi Disposequá trình trả về ( procbiến).

  1. using phạm vi:

    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. Hoặc Disposephương pháp:

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

Bây giờ bạn có thể sử dụng memorybiến được chuyển đổi thành Megabyte.


3
Lưu ý: Một megabyte là 2 ^ 20 chứ không phải 1e + 6
Hylaean

1
Một lưu ý. Trong C # ^là XOR bitwise, không phải nguồn. Vì vậy, chỉ cần sử dụng proc.PrivateMemorySize64 / (1024*1024), hoặcproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

Bạn đã bỏ lỡ dấu ngoặc đơn, nên proc.PrivateMemorySize64 / (1024 * 1024)là phép nhân không có mức độ ưu tiên trên phép chia.
Laurynas Lazauskas

@LaurynasLazauskas Tôi đã cập nhật câu trả lời. Cảm ơn.
Ahmad Payan

0

Đối với hệ thống hoàn chỉnh, bạn có thể thêm Microsoft.VisualBasic Framework làm tài liệu tham khảo;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.