<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/34392.aspx</link><pubDate>Tue, 21 Aug 2007 19:30:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34392</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/34392.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=34392</wfw:commentRss><description>&lt;P&gt;Δεν υπάρχει λόγος πανικού. Όπως είπα, άλλο νούμερο ενδιαφέρει τον τελικό χρήστη, άλλο τον προγραμματιστή και άλλο τον admin. Στην δική σου περίπτωση, μπορείς να θεωρήσεις ελεύθερα όλα τα διάφορα είδη όχι-εντελώς-ελεύθερης μνήμης. Η εφαρμογή σου θα μπορέσει άνετα να τα χρησιμοποιήσει χωρίς να χρειαστεί paging. &lt;/P&gt;
&lt;P&gt;Μία καλή λύση θα είναι να δείχνεις την τιμή του Available Bytes performance counter (ή μάλλον την Available MBytes - αν η εφαρμογή έχει μόνο Bytes διαθέσιμα, μάλλον θα έχεις πρόβλημα). Η περιγραφή της (στο Performance Monitor) λέει:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Available MBytes is the amount of physical memory available to processes running on the computer, in Megabytes, rather than bytes as reported in Memory\\Available Bytes. It is calculated by adding the amount of space on the &lt;STRONG&gt;Zeroed&lt;/STRONG&gt;, &lt;STRONG&gt;Free&lt;/STRONG&gt;, and &lt;STRONG&gt;Stand by&lt;/STRONG&gt; memory lists. Free memory is ready for use; Zeroed memory are pages of memory filled with zeros to prevent later processes from seeing data used by a previous process; Standby memory is memory removed from a process' working set (its physical memory) on route to disk, but is still available to be recalled.&amp;nbsp; This counter displays the last observed value only; it is not an average."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Οι Zeroed και Free είναι ουσιαστικά διαθέσιμη μνήμη, η Standby είναι σχεδόν διαθέσιμη. Ρίξε μία ματιά στο PerformanceCounter component, νομίζω ότι θα κάνει αυτό που θέλεις.&lt;/P&gt;</description></item><item><title>Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/34375.aspx</link><pubDate>Mon, 20 Aug 2007 23:22:59 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34375</guid><dc:creator>pontifikas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/34375.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=34375</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;Παναγιώτης Καναβός:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;Όσα ο Task Manager αναφέρει ως Free Memory ή System Memory είναι αναγκαστικά μία απλοποιημένη εικόνα του τί γίνεται πραγματικά με τη μνήμη. Τα Windows κρατάνε τη μνήμη σε σελίδες, η οποία μπορεί (χονδρικά) να είναι λευκή(δεν έγινε ποτέ allocated ή έχει καθαριστεί), σε χρήση (έχει δεδομένα αλλά είναι ίδια με το paging file), βρώμικη (η σελίδα διαφέρει από την αντίστοιχη στο paging file), παρατημένη (η σελίδα έγινε deallocated αλλά δεν καθαρίστηκε ακόμα). Οι παρατημένες δεν καθαρίζονται αμέσως, αφενός επειδή αυτό αργεί, αφετέρου γιατί μπορεί η εφαρμογή να την ζητήσει ξανά (αν π.χ. ήταν ο buffer ενός αρχείου).&amp;nbsp;Επίσης, οι σελίδες μπορεί να είναι shared (φορτωμένα DLL ή το .NET Runtime) από πολλές εφαρμογές, ή private για μία εφαρμογή μόνο. Στο virtual size μίας εφαρμογής θα μετρήσουν όλες, αλλά αυτό δεν σημαίνει ότι π.χ. κάθε εφαρμογή .NET καταλαμβάνει και 30 MB για το Runtime!
&lt;p&gt;Και εδώ είναι το ενδιαφέρον:&lt;br&gt;Οι παρατημένες σελίδες είναι ελεύθερες? Αν ναι, παίρνεις ένα ποσό ελεύθερης μνήμης.&amp;nbsp;Αν όχι, παίρνεις ένα άλλο ποσό ελεύθερης μνήμης. Κάθε έκδοση του λειτουργικού μετράει διαφορετικά την ελεύθερη μνήμη, προσπαθώντας να δώσει ένα νούμερο που να έχει σημασία και για τον απλό χρήστη, αλλά και για τον administrator. &lt;/p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-7.gif" alt="Tongue Tied" /&gt;&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-7.gif" alt="Tongue Tied" /&gt;&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-7.gif" alt="Tongue Tied" /&gt;&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-7.gif" alt="Tongue Tied" /&gt;&lt;br&gt;Με τσάκισες &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;br&gt;&lt;br&gt;Βασικά, έχω μια εφαρμογή η οποία, υπό συγκεκριμένες συνθήκες, μπορεί να καταναλώσει....τα πάντα. Οπότε θα ήθελα ο χρήστης να μπορεί να δεί τι μνήμη του απομένει σε σχέση με την &lt;br&gt;συνολική. Πρόκειται για εφαρμογή 3D γραφικών. Θέλω να πιστεύω ότι ο χρήστης θα έχει μπόλικη μνήμη οπότε ζητάω μόνο μια τάξη μεγέθους.&lt;br&gt;Φυσικά αν πάει κανείς να το τρέξει σε XP με τίποτα 512ΜΒ θα έχω γρήγορα πρόβλημα ή τουλάχιστον έτσι θα φαίνεται(αφού η απόκλιση στην οποία αναφέρθηκα είναι προς τα πάνω).&lt;br&gt;&lt;br&gt;Θα ψάξω πάντως για κάποια άλλη παράμετρο να επικαλεστώ σε επίπεδο συστήματος. &lt;br&gt;Αλήθεια δεν υπάρχει αντίστοιχη κλάση με την Process που να δείχνει όλα τα είδη μνήμης που ανέφερες?&lt;br&gt;&lt;br&gt;Ευχαριστώ πάντως για την απάντηση Παναγιώτη. Ήταν και επιμορφωτική(εκτός από αποσβολωτική(μάλλον δεν είναι δόκιμο αλλά δεν βαριέσαι))&lt;br&gt;</description></item><item><title>Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/34374.aspx</link><pubDate>Mon, 20 Aug 2007 21:58:20 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34374</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/34374.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=34374</wfw:commentRss><description>&lt;P&gt;Βασικά, το τί λέει ο Task Manager σε κάθε έκδοση του λειτουργικού δεν έχει μεγάλη σχέση με το ποιά είναι η "ελεύθερη μνήμη" και αλλάζει από λειτουργικό σε λειτουργικό. Άσε που το θέμα είναι τί εννοείς "Ελεύθερη μνήμη".&lt;/P&gt;
&lt;P&gt;Όσα ο Task Manager αναφέρει ως Free Memory ή System Memory είναι αναγκαστικά μία απλοποιημένη εικόνα του τί γίνεται πραγματικά με τη μνήμη. Τα Windows κρατάνε τη μνήμη σε σελίδες, η οποία μπορεί (χονδρικά) να είναι λευκή(δεν έγινε ποτέ allocated ή έχει καθαριστεί), σε χρήση (έχει δεδομένα αλλά είναι ίδια με το paging file), βρώμικη (η σελίδα διαφέρει από την αντίστοιχη στο paging file), παρατημένη (η σελίδα έγινε deallocated αλλά δεν καθαρίστηκε ακόμα). Οι παρατημένες δεν καθαρίζονται αμέσως, αφενός επειδή αυτό αργεί, αφετέρου γιατί μπορεί η εφαρμογή να την ζητήσει ξανά (αν π.χ. ήταν ο buffer ενός αρχείου).&amp;nbsp;Επίσης, οι σελίδες μπορεί να είναι shared (φορτωμένα DLL ή το .NET Runtime) από πολλές εφαρμογές, ή private για μία εφαρμογή μόνο. Στο virtual size μίας εφαρμογής θα μετρήσουν όλες, αλλά αυτό δεν σημαίνει ότι π.χ. κάθε εφαρμογή .NET καταλαμβάνει και 30 MB για το Runtime!&lt;/P&gt;
&lt;P&gt;Και εδώ είναι το ενδιαφέρον:&lt;BR&gt;Οι παρατημένες σελίδες είναι ελεύθερες? Αν ναι, παίρνεις ένα ποσό ελεύθερης μνήμης.&amp;nbsp;Αν όχι, παίρνεις ένα άλλο ποσό ελεύθερης μνήμης. Κάθε έκδοση του λειτουργικού μετράει διαφορετικά την ελεύθερη μνήμη, προσπαθώντας να δώσει ένα νούμερο που να έχει σημασία και για τον απλό χρήστη, αλλά και για τον administrator. &lt;/P&gt;
&lt;P&gt;Η παραπάνω περιγραφή είναι αναγκαστικά εξοργιστικά απλή. Για παρηγοριά, όλα τα σύγχρονα λειτουργικά έχουν το ίδιο περίπλοκη διαχείριση μνήμης. Για να καταλάβεις πάντως πραγματικά τί συμβαίνει με τη μνήμη θα πρέπει να διαβάσεις το&lt;A href="http://www.microsoft.com/technet/sysinternals/information/windowsinternals.mspx"&gt; Windows Internals&lt;/A&gt; του Mark Russinovich, όπου περιέχει ολόκληρο&amp;nbsp;κεφάλαιο&amp;nbsp;για Memory Management. Ευτυχώς,&amp;nbsp;ο Russinovich έχει γράψει και&amp;nbsp;κάποια σχετικά άρθρα στο &lt;A href="http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/"&gt;Technet Magazine&lt;/A&gt;, ενώ έχει φτιάξει και ένα εργαλείο, το &lt;A href="http://www.microsoft.com/technet/sysinternals/utilities/processexplorer.mspx"&gt;Process Explorer&lt;/A&gt; το οποίο είναι ΠΟΛΥ καλύτερο από τον Task Manager και δείχνει όλες τις λεπτομέρειες που θα ήθελες ποτέ για μνήμη, CPU, I/O κλπ. &lt;/P&gt;
&lt;P&gt;Και είναι και ο τύπος που έκανε τσακωτή την Sony όταν έβαλε rootkits στα CD της για λόγους ... copy protection!&lt;/P&gt;</description></item><item><title>Εύρεση χρησιμοποιούμενης μνήμης συστήματος</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/34368.aspx</link><pubDate>Mon, 20 Aug 2007 16:15:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34368</guid><dc:creator>pontifikas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/34368.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=34368</wfw:commentRss><description>&amp;nbsp;&amp;nbsp;&amp;nbsp; Έχω κολλήσει προσπαθώντας να βγάλω μερικά διαγνωστικά στοιχεία για το πρόγραμμά μου. Ένα από αυτά είναι, πόση μνήμη, συνολικά, χρησιμοποιείται &lt;br&gt;αυτή την στιγμή στον υπολογιστή μου.&lt;br&gt;&lt;br&gt;Για να το κάνω αυτό, αρχικά υπολογίζω την συνολική μνήμη του υπολογιστή μου :&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public static double &lt;/span&gt;&lt;/span&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;TotalSystemMemory = 0.0;&lt;/span&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;br&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; GetTotalSystemMemory()&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double&lt;/span&gt; totalCapacity &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectQuery objectQuery &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; ObjectQuery(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"select * from Win32_PhysicalMemory"&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementObjectSearcher searcher &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementObjectSearcher(objectQuery);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementObjectCollection vals &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; searcher.Get();&lt;br&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach&lt;/span&gt; (ManagementObject val &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; vals)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; totalCapacity += System.Convert.ToDouble(val.GetPropertyValue(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Capacity"&lt;/span&gt;));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSystemMemory &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; totalCapacity &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; 1024.0;&lt;br&gt;        }&lt;/span&gt;&lt;br&gt;&lt;br&gt;Ομολογώ ότι δεν έχω καταλάβει πώς δουλεύουν τα Management Objects αλλά αυτο μου επιστρέφει σωστό αποτέλεσμα.&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;br&gt;&lt;br&gt;Στην συνέχεια, επειδή δεν μπόρεσα να βρώ έναν τρόπο για να βρώ απευθείας την χρησιμοποιούμενη μνήμη, βρήκα ένα τρόπο να &lt;br&gt;βρώ την ελεύθερη με Performance Counters, οπότε,αφαιρετικά, βρίσκω πόση μνήμη χρησιμοποιείται. &lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt; PerformanceCounter ramCounter &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; PerformanceCounter(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Memory"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Available KBytes"&lt;/span&gt;);&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; MainTimer_Tick(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br&gt;        {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalUsedMemorySize &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;)IRBrain.TotalSystemMemory &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; (&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;)ramCounter.NextValue();&amp;nbsp;  &lt;br&gt;        }&lt;/span&gt;&lt;br&gt;&lt;br&gt;Στα Vista όμως αυτό μου δίνει γύρω στα 5ΜΒ απόκλιση από αυτό που δείχνει ο TaskManager, ενώ στα XP έχω απόκληση περί τα 150MB!!!&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-7.gif" alt="Tongue Tied" /&gt;&lt;br&gt;&lt;br&gt;Τί μπορεί κάνω λάθος?&lt;br&gt;&lt;br&gt;Ευχαριστώ.&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>