C # में उपलब्ध मेमोरी का उपयोग कैसे करें


136

मैं एप्लिकेशन द्वारा उपलब्ध रैम या मेमोरी का उपयोग कैसे कर सकता हूं?


आपको System.Diagnostics.Processकक्षा पर एक नज़र डालनी चाहिए ।
रोनाल्ड वाइल्डबर्ग

3
ध्यान दें, वर्तमान में उपयोग की जाने वाली भौतिक रैम कार्यशील सेट है, आवंटित की गई मेमोरी निजी या साझा बाइट्स (आवंटन के प्रकार के आधार पर) में आती है।
रिचर्ड

जवाबों:


172

आप उपयोग कर सकते हैं:

Process proc = Process.GetCurrentProcess();

वर्तमान प्रक्रिया और उपयोग पाने के लिए:

proc.PrivateMemorySize64;

निजी मेमोरी उपयोग प्राप्त करने के लिए। अधिक जानकारी के लिए इस लिंक को देखें


52
यह शायद ध्यान दिया जाना चाहिए कि GetCurrentProcess के लिए एक कॉल अपने आप में काफी संसाधनों का आवंटन करेगा। कॉल किए जाने पर लौटी प्रक्रिया पर कॉल डिस्पोज़ करें, या पूरे कोड को "उपयोग कर" स्कोप में लपेटें।
मथियास लिकेगार्ड लोरेनजेन

9
Namespace: System.Diagnostics असेंबली: सिस्टम (System.dll में)
Enigma Plus

12
मैं यह भी जोड़ना चाहूंगा कि PrivateMemorySize64 प्रॉपर्टी (+ अन्य प्रॉपर्टीज) खुद ही रीफ्रेश () कहे जाने तक अपने आप अपडेट नहीं होती है। (यह ऊपर दिए गए लिंक पर पृष्ठ पर उल्लिखित है।)
स्कॉटहेयर

1
अधिक जवाब के लिए इसी तरह के अन्य प्रश्न देखें: stackoverflow.com/questions/14032515/…
हारून डी

1
@ ScottRhee ने मुझे सही किया है अगर मैं गलत हूं - लेकिन मैं कहूंगा कि संपत्ति के मूल्य उस समय "अप टू डेट" हैं जिसे आप कॉल करते हैं GetCurrentProcess, लेकिन गुणों को एक्सेस करने से पहले यदि आप अन्य ऑपरेशन कर रहे हैं तो केवल ताज़ा करने की आवश्यकता है। स्रोत - रिमार्क्स कहते हैं कि जिस समय स्नैपशॉट बनाया जाता है उस समय गुण सही होते हैं।
टैबजाइना

38

आप GC.GetTotalMemory की जांच करना चाहते हैं विधि की ।

यह वर्तमान में कचरा कलेक्टर द्वारा आवंटित किए जाने वाले बाइट्स की संख्या को पुनः प्राप्त करता है।


12
केवल हालांकि प्रबंधित ढेर में। अरकैन के जवाब को देशी और प्रबंधित दोनों तरह के ढेर देने चाहिए।
योर

25

System.Environment में WorkingSet है - 64-बिट हस्ताक्षरित पूर्णांक जिसमें भौतिक मेमोरी के बाइट्स की संख्या है जो प्रक्रिया के संदर्भ में मैप की गई है।

यदि आप बहुत अधिक विवरण चाहते हैं तो System.Diagnostics.PerformanceCounter है , लेकिन इसे सेटअप करने के लिए थोड़ा और प्रयास करना होगा।


क्या आप (या कोई व्यक्ति) इस बात का उदाहरण दे सकते हैं कि सिस्टम उपलब्ध / उपयोग की गई मेमोरी को प्राप्त करने के लिए PerformanceCounter का उपयोग कैसे करें?
निर्माण का मूल

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 उपयोग का वास्तविक मूल्य देता है। अधिक विवरण यहां देखें ।


6

के अलावा @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 है
हिलेयन

1
एक नोट। C # में बिट ^वाइज XOR है, पावर नहीं। तो बस का उपयोग करें proc.PrivateMemorySize64 / (1024*1024), याproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

आप कोष्ठक से चूक गए, proc.PrivateMemorySize64 / (1024 * 1024)गुणा होना चाहिए क्योंकि विभाजन पर प्राथमिकता नहीं है।
लॉरिएनास लाजौस्कस

@LaurynasLazauskas मैंने उत्तर को अपडेट कर दिया है। धन्यवाद।
अहमद पयान

0

संपूर्ण सिस्टम के लिए आप Microsoft.VisualBasic Framework को संदर्भ के रूप में जोड़ सकते हैं;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.