วิธีรับหน่วยความจำที่พร้อมใช้งานหรือใช้ใน C #


141

ฉันจะรับ RAM หรือหน่วยความจำที่แอปพลิเคชันใช้งานได้อย่างไร


คุณควรดูที่System.Diagnostics.Processชั้นเรียน
Ronald Wildenberg

3
หมายเหตุฟิสิคัลแรมที่ใช้ในปัจจุบันคือชุดการทำงานหน่วยความจำที่จัดสรรจะอยู่ในไบต์ส่วนตัวหรือที่ใช้ร่วมกัน (ขึ้นอยู่กับประเภทของการจัดสรร)
Richard

คำตอบ:


174

คุณสามารถใช้ได้:

Process proc = Process.GetCurrentProcess();

ในการรับกระบวนการปัจจุบันและใช้:

proc.PrivateMemorySize64;

เพื่อรับการใช้งานหน่วยความจำส่วนตัว สำหรับข้อมูลเพิ่มเติมโปรดดูที่ลิงค์นี้


52
ควรสังเกตว่าการเรียกใช้ GetCurrentProcess จะจัดสรรทรัพยากรได้ค่อนข้างมาก เรียก Dispose ในกระบวนการที่ส่งคืนเมื่อเสร็จสิ้นหรือห่อรหัสทั้งหมดในขอบเขต "ใช้"
Mathias Lykkegaard Lorenzen

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

13
ฉันต้องการเพิ่มด้วยว่าคุณสมบัติ PrivateMemorySize64 (+ คุณสมบัติอื่น ๆ ) เองจะไม่ได้รับการอัปเดตโดยอัตโนมัติจนกว่าจะมีการเรียก Refresh () (มีการระบุไว้ในหน้าตามลิงค์ด้านบน)
ScottRhee

1
ดูคำถามอื่นที่คล้ายกันนี้สำหรับคำตอบเพิ่มเติม: stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee แก้ไขฉันถ้าฉันผิด - แต่ฉันจะเพิ่มว่าค่าคุณสมบัติ "เป็นปัจจุบัน" ในขณะที่คุณโทรหาGetCurrentProcessแต่จะต้องได้รับการรีเฟรชก็ต่อเมื่อคุณกำลังดำเนินการอื่น ๆ ก่อนที่จะเข้าถึงคุณสมบัติ ที่มา - ข้อสังเกตบอกว่าคุณสมบัติถูกต้องในขณะที่สร้างสแนปชอตของกระบวนการ
tabjsina

38

คุณอาจต้องการตรวจสอบเมธอดGC.GetTotalMemory

จะดึงจำนวนไบต์ที่คิดว่าในปัจจุบันจัดสรรโดยตัวรวบรวมขยะ


13
เฉพาะในกองที่มีการจัดการเท่านั้น คำตอบของ Arkain ควรให้ทั้งแบบดั้งเดิมและแบบมีการจัดการ
Yaur

25

System.EnvironmentมีWorkingSet - จำนวนเต็มที่ลงนาม 64 บิตที่มีจำนวนไบต์ของหน่วยความจำฟิสิคัลที่แมปกับบริบทของกระบวนการ

หากคุณต้องการรายละเอียดมากมายมีSystem.Diagnostics.PerformanceCounterแต่จะต้องใช้ความพยายามมากขึ้นในการตั้งค่า


คุณ (หรือใครบางคน) สามารถยกตัวอย่างวิธีใช้ PerformanceCounter เพื่อรับหน่วยความจำที่มี / ใช้งานของระบบได้หรือไม่?
The Elemental of Creation

11

ดูรายละเอียดที่นี่

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

}

หากคุณได้รับค่าเป็น 0 จำเป็นต้องเรียกNextValue()สองครั้ง จากนั้นจะให้ค่าที่แท้จริงของการใช้งาน CPU ดูรายละเอียดเพิ่มเติมที่นี่


7

นอกจากนี้ในการ@JesperFyhrKnudsen 'คำตอบและ@MathiasLykkegaardLorenzenความคิดเห็นของคุณควรที่จะdisposeกลับมาProcessหลังจากที่ใช้มัน

ดังนั้นในการกำจัดProcessคุณสามารถห่อหุ้มไว้ในusingขอบเขตหรือเรียกDisposeกระบวนการส่งคืน ( procตัวแปร)

  1. using ขอบเขต:

    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. หรือDisposeวิธีการ:

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

ตอนนี้คุณสามารถใช้memoryตัวแปรที่แปลงเป็นเมกะไบต์


3
หมายเหตุ: หนึ่งเมกะไบต์คือ 2 ^ 20 ไม่ใช่ 1e + 6
Hylaean

2
หนึ่งบันทึก ใน C # ^คือ XOR แบบบิตไม่ใช่กำลัง เพียงแค่ใช้proc.PrivateMemorySize64 / (1024*1024)หรือproc.PrivateMemorySize64 / (1 << 20)
СергейРыбаков

คุณไม่ได้ใส่วงเล็บควรเป็นproc.PrivateMemorySize64 / (1024 * 1024)เพราะการคูณไม่มีลำดับความสำคัญเหนือการหาร
Laurynas Lazauskas

@LaurynasLazauskas ฉันได้อัปเดตคำตอบ ขอบคุณ.
Ahmad Payan

0

สำหรับระบบที่สมบูรณ์คุณสามารถเพิ่ม Microsoft.VisualBasic Framework เป็นข้อมูลอ้างอิงได้

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.