2012-02-22 6 views
14

मैं एक सी # प्रोग्रामम, स्मृति उपयोग में मापने की कोशिश कर रहा हूं।सी # के साथ मेमोरी उपयोग को मापने के लिए कैसे करें (जैसा कि हम जावा में कर सकते हैं)?

मैं इस जावा समारोह के बराबर सी # जानना चाहते हैं:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 

कि कुल स्मृति ढेर के लिए आवंटित प्रतिनिधित्व करते हैं। मुझे अपने सी # प्रोग्राम के लिए आवंटित स्मृति के कुल आकार को जानने की आवश्यकता है।

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 

वर्तमान में मैं सी # में इस का उपयोग प्रयुक्त स्मृति पाने के लिए:

Process_Memory = MyProcess.PrivateMemorySize64; 

लेकिन मैं पूरी तरह से यकीन है कि यह है नहीं कर रहा हूँ

फिर जावा में मैं के साथ प्रयोग किया स्मृति प्राप्त कर सकते हैं बराबर।

तो फिर से शुरू करने में मुझे अपने सी # एप्लिकेशन के लिए कुल आवंटित स्थान और वर्तमान समय में टी पर उपयोग कैसे प्राप्त किया जा सकता है?

संपादित करें:

जवाब से

और आगे अनुसंधान मैं यह निर्धारित कर दिया है:

उपयोग

System.GC.GetTotalMemory(false); 

में वर्तमान स्मृति नंबर दो बाइट्स वर्तमान के वाई प्रबंधित स्मृति में आवंटित। (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

यह विधि एक कम मूल्य लौट सकते हैं और मैं बहुत यकीन है कि यह वास्तव में उपयोग में सभी स्मृति का प्रतिनिधित्व नहीं है के रूप में मैं के साथ getUsed()में जावा प्राप्त कर सकते हैं कर रहा हूँ। जावा में उसी एप्लिकेशन के लिए मेमोरी 5 एमबी पर शुरू होती है और 125 एमबी अधिकतम तक जाती है। सी # के साथ उपर्युक्त विधि के साथ 1 से 5 एमबी तक मिलता है।

ऐसा लगता है कि:

MyProcess.PrivateMemorySize64; // return ~=25MB 

या

MyProcess.WorkingSet64; //return ~=20MB 

उपयोग में सभी स्मृति का एक और अधिक सटीक मूल्य दे। लेकिन मुझे नहीं पता कि मुझे किस का उपयोग करना चाहिए ...

वैश्विक आबंटित स्मृति के लिएthis article उपयोग करने के लिए पता चलता है:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 

यह हमेशा एक ही मूल्य programm साथ लौटने के लिए, 169MB के बारे में है कि जावा की तुलना में उचित लगता है: 64 एमबी से 170 तक एमबी अधिकतम

मैं अभी भी एक सटीक जवाब सब मैंने पाया की तलाश में हूँ बहुत अस्पष्ट है और मैं विंडोज स्मृति प्रबंधन से परिचित नहीं हूँ, मैं सच में डॉक्स मैंने पाया undertand करने के लिए यकीन नहीं है:/

उत्तर

9

GC स्थिर वर्ग इस प्रकार की सभी जानकारी प्रदान करता है।

शायद आपके GC.GetTotalMemory() के बाद।

संपादित करें:

मुझे विश्वास है कि कसरत अपनी स्मृति पदचिह्न के आधार पर वर्तमान में निहित वस्तुओं के लिए प्रयास किए गए। यदि आप प्रक्रिया के लिए आवंटित कुल आकार चाहते हैं (यानी मुफ्त बफर सहित) Process कक्षा का उपयोग करें। उदाहरण के लिए:

Process.GetCurrentProcess().WorkingSet64; 
+0

हाँ मैं यह जानता हूँ, लेकिन यह प्रबंधित ढेर में वस्तुओं का वास्तविक आकार दें, यह एक कम मूल्य है। मुझे नहीं लगता कि यह सभी आवंटित स्मृति का प्रतिनिधि है। –

+0

तब मेरा मानना ​​है कि आपको 'प्रक्रिया' कक्षा के उन सभी गुणों का उपयोग करने की आवश्यकता है यदि आप कच्चे आवंटित स्मृति चाहते हैं (यानी किसी भी प्रबंधित जीसी कार्यक्षमता को ध्यान में रखते हुए)। 'PagedMemorySize64', 'PrivateMemorySize64', आदि – Tyson

+0

धन्यवाद, इसलिए मुझे लगता है कि अगर मैं सिर्फ प्रोसेसस कुल आवंटित स्मृति' PrivateMemorySize64' चाहता हूं तो पर्याप्त हो सकता है। मुझे पजेड मेमोरी नहीं मिलती है ... –

13

यहाँ एक ही रास्ता है, जी सी का उपयोग कर:

public void Test() 
    { 
     long kbAtExecution = GC.GetTotalMemory(false)/1024; 

     // do stuff that uses memory here 

     long kbAfter1 = GC.GetTotalMemory(false)/1024; 
     long kbAfter2 = GC.GetTotalMemory(true)/1024; 

     Console.WriteLine(kbAtExecution + " Started with this kb."); 
     Console.WriteLine(kbAfter1 + " After the test."); 
     Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added."); 
     Console.WriteLine(kbAfter2 + " Amt. After Collection"); 
     Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");   
    } 

या वैकल्पिक रूप से System.Diagnostics.PerformanceCounter का उपयोग कर काम कर सेट की जानकारी प्राप्त करने के लिए:

PerformanceCounter performanceCounter = new PerformanceCounter(); 

performanceCounter.CategoryName = "Process"; 

performanceCounter.CounterName = "Working Set"; 

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName; 

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0")); 
+0

उत्तर के लिए धन्यवाद। इसलिए, जैसा कि डॉक्टर कहते हैं, 'जीसी.गेटटॉटलमेमरी (झूठी)' वर्तमान में प्रबंधित स्मृति में आवंटित बाइट्स की संख्या लौटाता है। मुझे लगता है कि यह जावा में getUse() के बराबर हो सकता है। लेकिन मुझे आवंटित पूरी जगह कैसे मिलती है? क्या 'System.Diagnostics.Process.GetCurrentProcess()। PrivateMemorySize64' उस मान का प्रतिनिधित्व करता है? –

+1

सही है, हाँ। –

+0

दूसरे समाधान के लिए यह 'System.InvalidOperationException' –

संबंधित मुद्दे