<?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>Πρώτα Βήματα - Γλώσσες προγραμματισμού</title><link>https://www.dotnetzone.gr:443/cs/forums/74/ShowForum.aspx</link><description>Τα πρώτα βήματα στις γλώσσες VB6, VB.NET, και C#</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63132.aspx</link><pubDate>Wed, 09 Feb 2011 17:33:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63132</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63132.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63132</wfw:commentRss><description>Γι αυτό και έβαλα την περιττή MoveTriangle για να δεις ότι και με 800.000 επαναλήψεις, πάλι δεν αλλάζει τίποτε. Όσο για τα αντικείμενα που δημιουργούνται ενδιάμεσα, ε ναι. Και στην VB6 πάλι δεν θα τα δημιουργούσες? Και δεν θα έτρωγες το performance hit επειδή θα τα καθάριζες ένα-ένα αντί όλα μαζί στο τέλος? Ο λόγος που ο garbage collector δεν εκτελείται συνέχεια είναι ότι το καθάρισμα κοστίζει σε CPU. Αντί για πολλά μικρά καθαρίσματα έχεις ένα μεγάλο, μόνο όταν χρειαστεί.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αν σκεφτείς ότι στόχος σου είναι να τελειώσει ο υπολογισμός γρηγορότερα, ή να μπορέσεις με το ίδιο μηχάνημα να επεξεργαστείς περισσότερα τρίγωνα, θα δεις ότι το κυνήγι της μνήμης είναι δευτερεύον. Για παράδειγμα, είναι ΚΑΛΟ να μην μοιράζεσαι αντικείμενα, γιατί έτσι μπορείς να τα επεξεργαστείς παράλληλα. Διαφορετικά, cores τα οποία προσπαθούν να επεξεργαστούν διαφορετικά τρίγωνα θα αναγκαστούν να περιμένουν το ένα το άλλο αν αυτά τα τρίγωνα "μοιράζονται" κορυφές.&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63131.aspx</link><pubDate>Wed, 09 Feb 2011 17:24:58 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63131</guid><dc:creator>fanisg</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63131.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63131</wfw:commentRss><description>Ευχαριστώ πολύ για όλο τον κόπο που κάνετε.&lt;div&gt;Καταρχήν δεν μπορώ να χρησιμοποιήσω repository &amp;amp; references (κάτι που προσπάθησα μεν, απλά δεν μου έκανε) διότι πολλά αντικείμενα δημιουργούνται (και πρέπει να διαγράφονται) ως ενδιάμεσα στάδια υπολογισμών. Εκεί έχω βασικά το πρόβλημα (φαντάζομαι). Κατά τα άλλα η λογική είναι θεωρητικά αντίστοιχη με τον κώδικα της παράθεσης, απλά όλες οι διαδικασίες των σύνθετων οντοτήτων, ενώ χρησιμοποιούν ως βάση την απλή οντότητα τύπου Poiint3D, δημιουργούν είτε ως τελικά είτε ως ενδιάμεσα αποτελέσματα άλλα σύνθετα ή απλά αντικείμενα τα οποία πρέπει εν τέλει να αλληλεπιδράσουν με το αρχικό... μπάχαλο...&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Πήρα ωστόσο μια καλή γραμμή από όσα γράψατε. Ελπίζω να έχω καλά νέα σύντομα.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Respect&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63118.aspx</link><pubDate>Tue, 08 Feb 2011 23:26:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63118</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63118.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63118</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Ξεκίνησα σουλούπωμα... δεν θέλω τα αντικείμενα να είναι references, πρέπει να είναι αυτόνομα.&lt;br&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Εξακολουθείς να μπερδεύεις τις έννοιες. Δεν είναι τα αντικείμενα references ούτε υπάρχουν αντικείμενα που δεν είναι αυτόνομα. Αυτόνομα είναι όλα. Όταν όμως χρησιμοποιείς ένα αντικείμενο, ουσιαστικά χρησιμοποιείς ένα reference, ένα pointer στην πραγματική του θέση στη μνήμη. Ακόμα και struct αν είναι το αντικείμενο, μέσω reference του μιλάς. Reference σημαίνει "αναφορά". Αναφέρεσαι σε ένα αντικείμενο, δεν είσαι το αντικείμενο.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Επίσης, η έννοια της "αυτονομίας" δεν υπάρχει. Το ότι ο garbage collector ελέγχει τα references μεταξύ των αντικειμένων δεν σημαίνει ότι υπάρχει κάποια εξάρτηση μεταξύ τους, το αντίθετο. ΕΠΕΙΔΗ ΕΙΝΑΙ ΑΝΕΞΑΡΤΗΤΑ πρέπει να τα ελέγξει. Αν υπήρχε σχέση parent child, ένα child δεν θα μπορούσε ποτέ να κρατήσει ζωντανό ένα parent. Η κορυφή δεν θα μπορούσε ποτέ να κρατήσει ζωντανό ένα τρίγωνο. Αυτό όμως δεν συμβαίνει.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ακόμα και αν χρησιμοποιήσεις structs τα οποία περνάς στα functions byval (οπότε δημιουργείς αντίγραφα) δεν θα κάνεις τίποτε γιατί το πρόβλημα δεν ήταν το byval αλλά οι σχέσεις μεταξύ των αρχικών αντικειμένων.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Δοκίμασε πρώτα με καθαρά αντικείμενα και χωρίς πειρασμένες παραμέτρους στις μεταβλητές, χωρίς αντικείμενα που "μοιράζονται", για να δεις πως δουλεύει κανονικά το .NET και μετά δοκίμασε τις βελτιώσεις. Η συμπεριφορά που βλέπεις τώρα δεν είναι ομαλή και οφείλεται στις παρεμβάσεις που έχουν γίνει.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τώρα, για να πεισθούμε ότι όντως δεν χάνεται μνήμη και τα references δεν φταίνε, έφτιαξα τις παρακάτω κλάσεις για τρίγωνα:&lt;/div&gt;&lt;div&gt;&lt;pre&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&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Point3D
        {
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&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; X { get; set; }
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&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; Y { get; set; }
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&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; Z { get; set; }
        }

        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; Triangle
        {
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; Point3D[] Vertices { get; set; } 
        }&lt;/span&gt;&lt;/pre&gt;Και έφτιαξα και μία λίστα με 800.000 τρίγωνα, τα οποία πειράζω με τον παρακάτω κώδικα:&lt;/div&gt;&lt;div&gt;&lt;pre&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;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; Main(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt;[] args)
        {
            Console.WriteLine(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Idle"&lt;/span&gt;);
            Console.ReadKey();
            
            var triangles &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Generate(800000);            
            
            Console.WriteLine(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Generated"&lt;/span&gt;);
            Console.ReadKey();

            Move(triangles);
            
            Console.WriteLine(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Moved"&lt;/span&gt;);
            Console.ReadKey();
        }

        &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;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; Move(List&amp;lt;Triangle&amp;gt; triangles)
        {
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (Triangle triangle &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; triangles)
            {
                MoveTriangle(triangle);
            }
        }

        &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;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; MoveTriangle(Triangle triangle)
        {
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (Point3D edge &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; triangle.Vertices)
            {
                edge.X += 10;
                edge.Y += 10;
                edge.Z += 10;
            }
        }

        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&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; List&amp;lt;Triangle&amp;gt; Generate(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; count)
        {
            var triangles=&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; List&amp;lt;Triangle&amp;gt;();
            var r=&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Random();
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&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; i=0;i&amp;lt;count;i++)
            {
                triangles.Add(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Triangle {
                                Vertices=&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&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; Point3D{X=r.Next(),Y=r.Next(),Z=r.Next()},
                                        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Point3D{X=r.Next(),Y=r.Next(),Z=r.Next()},
                                        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Point3D{X=r.Next(),Y=r.Next(),Z=r.Next()},
                                    }});
                
            }
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; triangles;
        }&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Η μνήμη του προγράμματος ανεβαίνει στα 90 MB περίπου μόλις δημιουργηθούν τα αντικείμενα και παραμένει εκεί, παρότι (ή μάλλον επειδή) η λίστα και τα αντικείμενα περνάνε ως references στη Move και τη MoveTriangle.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Δοκίμασα επίσης να βγάλω τον κώδικα Generate, Move σε function και να το επαναλάβω 100 φορές. Αυτό που είδα ήταν ότι η μνήμη ανεβοκατέβαινε μεταξύ 90 και 160 MB καθώς ο GC δεν έτρεχε αμέσως μετά από κάθε iteration. Αυτό όμως δεν με επηρέαζε καθώς στο τέλος η μνήμη πάντα καθάριζε.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63116.aspx</link><pubDate>Tue, 08 Feb 2011 22:26:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63116</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63116.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63116</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Πάμε από την αρχή:&amp;nbsp;&lt;DIV&gt;1. Να χρησιμοποιώ απλή&amp;nbsp;εκχώρηση (=) ή clone;&lt;/DIV&gt;&lt;DIV&gt;2. Τα references στο ίδιο αντικείμενο επιβαρύνουν τη μνήμη αθροιστικά;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Έχοντας πρόσφατες μνήμες παρόμοιου εγχειρήματος - φαντάσου οικοδομικά τετράγωνα που έπρεπε να ομαδοποιηθούν με διάφορα κριτήρια:&lt;/DIV&gt;&lt;UL&gt;&lt;LI&gt;Φόρτωσα όλα τα οικοδομικά τετράγωνα σε μια λίστα από custom objects - new για κάθε νέο object,&lt;/LI&gt;&lt;LI&gt;στην συνέχεια για καθένα από αυτά, περιείχε μια λίστα από τα γειτονικά του τετράγωνα - το .Add στην λίστα έβαζε το αποτέλεσμα ενός LINQ query με το Id του τετραγώνου&lt;/LI&gt;&lt;LI&gt;Η κύρια εργασία ήταν να φτιαχτούν ομάδες από τετράγωνα (custom object). που και πάλι υπήρχαν .Αdd στην λίστα από κριτήρια αναζήτησης -&amp;nbsp;LINQ&amp;nbsp;query&amp;nbsp;-&amp;nbsp;επάνω στα γειτονικά τετράγωνα κάθε τετραγώνου&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Καταλαβαίνεις ότι για κάθε τετράγωνο, το αντικείμενο είχε από ένα reference σε κάθε γείτονά του, αλλά και στην λίστα της ομάδας&amp;nbsp;που άνηκε. Αν και υπήρχαν διαδικασίες που έβγαζαν οικοδομικά τετράγωνα από τις λίστες των ομάδων και τα έβαζαν σε άλλες ομάδας, δεν αντιλήφθηκα κάπου να έχω πρόβλημα, είτε στο perfomance, είτε στο να μένουν "σκουπίδια" στην μνήμη. Τα references είναι ουσιαστικά counters που χρησιμοποιεί ο GC για να ξέρει αν θα πρέπει να απελευθερώσει την μνήμη όταν ένα object έχει μαρκαριστεί σαν "deleted".&lt;/P&gt;&lt;P&gt;Θα πρότεινα να ξαναδείς το project σου από την αρχή, ώστε να υπάρχει κάποιο κεντρικό repository των αντικειμένων που είναι το βασικό στοιχείο και όπου αλλού τα χρειάζεσαι, να τα περνάς σαν reference μέσα από το repository σου.&lt;/P&gt;&lt;P&gt;George J.&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63114.aspx</link><pubDate>Tue, 08 Feb 2011 21:14:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63114</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63114.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63114</wfw:commentRss><description>Αντώνη, αυτά είναι μερικά από τα νούμερα που σου δίνουν και οι profilers. Οι profilers όμως πάνε παρακάτω και σου δίνουν και πληροφορίες για τους τύπους των αντικειμένων, πού και πότε έγιναν allocate και άλλες πληροφορίες. Πέρα από τα performance counters χρησιμοποιούν και το Profiling API για να σου δείξουν περισσότερες πληροφορίες.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Σωτήρη, δεν νομίζω ότι το caching έχει νόημα. Υποψιάζομαι ότι το μοίρασμα των κορυφών είναι μία προσπάθεια να "σωθεί" μνήμη. Αλήθεια, πόση μνήμη πιάνουν αυτά τα 800.000 αντικείμενα? Γιατί αν π.χ. μιλάμε για τρίγωνα τότε (800.000 τρίγωνα * 3 κορυφές * 3 σημεία * 4 bytes) = 27 ΜΒ! Δεν είναι δα και τίποτε φοβερό.&amp;nbsp;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63113.aspx</link><pubDate>Tue, 08 Feb 2011 21:10:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63113</guid><dc:creator>fanisg</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63113.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63113</wfw:commentRss><description>Ξεκίνησα σουλούπωμα... δεν θέλω τα αντικείμενα να είναι references, πρέπει να είναι αυτόνομα. Πιστεύω πως τότε θα μπορέσει να γίνει εκκαθάριση.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Για τα τυπικά, ο κώδικας δεν είναι 20.000 χύμα γραμμές, απλά είναι πολλές κλάσεις οι οποίες κληρονομούν και κληρονομούνται. Η κάθε κλάση προσφέρει τις μεθόδους και τα constructors της αυτόνομα. Θα επανέλθω αν δεν βγάλω και πάλι άκρη, πιθανώς για απόδοση υπεργολαβικά της εκκαθάρισης και τακτοποίησης.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Σας ευχαριστώ για το χρόνο σας. Respect &amp;amp; many thanks to all.&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63111.aspx</link><pubDate>Tue, 08 Feb 2011 21:06:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63111</guid><dc:creator>Antonios Chatzipavlis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63111.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63111</wfw:commentRss><description>&lt;P&gt;απλά να συνεισφέρω και εγω στην ζητήση...&lt;/P&gt;
&lt;P&gt;αν πατε στο performance monitor του λειτουργίκου ( start &amp;gt; run &amp;gt; perfmon ), μπορείτε να προσθέσετε κάτι όμορφους μετρητές (.ΝΕΤ CLR Memory) που υπάρχουν ψηλααα στην λίστα των objects και να διαλέξετε όλους με την αντίστοιχη εφαρμογή... ώστε να δούμε νουμερακια ωραία και χρήσιμα&lt;/P&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63110.aspx</link><pubDate>Tue, 08 Feb 2011 21:05:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63110</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63110.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63110</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;@cap:&lt;div&gt;Ναι, χρησιμοποιώ διπλότυπες τιμές που δεν χρειάζονται, μέχρι αποδείξεως του εναντίον. Π.χ. 2 τρίγωνα που μοιράζονται την ίδια κορυφή. Θα μπορούσε το 2ο να πάρει το σημείο ως reference του πρώτου. Αν στην πορεία όμως έπρεπε τα τρίγωνα να "ξεκολλήσουν" ή ακόμα χειρότερα το 1ο να διαγραφεί;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τότε ένας συνδυασμός sharing όπου χρειάζεται και copy όπου πάλι χρειάζεται ίσως σου ελευθέρωνε λίγη μνήμη.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63109.aspx</link><pubDate>Tue, 08 Feb 2011 21:03:36 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63109</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63109.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63109</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;@cap:&lt;div&gt;Ναι, χρησιμοποιώ διπλότυπες τιμές που δεν χρειάζονται, μέχρι αποδείξεως του εναντίον. Π.χ. 2 τρίγωνα που μοιράζονται την ίδια κορυφή. Θα μπορούσε το 2ο να πάρει το σημείο ως reference του πρώτου. Αν στην πορεία όμως έπρεπε τα τρίγωνα να "ξεκολλήσουν" ή ακόμα χειρότερα το 1ο να διαγραφεί;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;div&gt;Τί λες, ότι έχεις ένα αντικείμενο-κορυφή το οποίο χρησιμοποιείται από 2 τρίγωνα? Ε τότε, αν δεν ελευθερώσεις και τα δύο τρίγωνα, δεν πρόκειται να διαγραφούν ούτε αυτά ούτε η κορυφή. Από τη στιγμή που κάπου υπάρχει reference στο ένα τρίγωνο, άρα και στην κορυφή του, άρα υπάρχει και στο 2ο τρίγωνο μέσω της κορυφής του.&amp;nbsp;Και αν είναι πολλά αυτά τα "μοιράσματα" θα καταλήξεις με όλα τα αντικείμενα αλληλομπλεγμένα στη μνήμη.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63108.aspx</link><pubDate>Tue, 08 Feb 2011 20:59:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63108</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63108.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63108</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αν το refernce γεννάει αντικείμενα τότε η μόνη λύση είναι το clone?&lt;/div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;div&gt;Το reference δεν γεννάει αντικείμενα, είναι απλά ένα "pointer" σε μία θέση μνήμης. Αν βλέπεις πολλαπλά αντικείμενα είναι γιατί τα κρατάς εσύ κάπου. Απλά και μόνο ότι μπερδεύεις reference με clone (που όντως δημιουργεί αντικείμενα) σημαίνει ότι πρέπει να πατήσεις φρένο.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Απομόνωσε και δοκίμασε τον κώδικα σου για να δεις ποιά είναι η "νορμάλ" συμπεριφορά, και να πεισθείς ότι η γή είναι στρογγυλή και ο ήλιος κίτρινος. Όσο προσπαθείς να βρεις bug στο .NET θα χάνεις το χρόνο σου. Άσε που αν έχεις 20.000 μονολιθικό κώδικα ο οποίος δεν μπορεί να σπάσει, χρειάζεται σίγουρα καθάρισμα.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Επίσης, ο profiler πρέπει να σου δίνει πληροφορίες για το που έχουν γίνει τα allocations, που υπάρχουν ακόμα references και σίγουρα πόσα αντικείμενα είναι ακόμα στη μνήμη και έχουν ξεφύγει από garbage collections. Τί σου λέει? Σε ποιά generations βρίσκονται τα αντικείμενα? Μήπως έχεις ορίσει destructors? Στην περίπτωση αυτή τα αντικείμενα παραμένουν περισσότερο στη μνήμη γιατί ο GC πρέπει να καλέσει τον destructor, όχι απλά να καθαρίσει τη μνήμη.&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63107.aspx</link><pubDate>Tue, 08 Feb 2011 20:51:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63107</guid><dc:creator>dimos.homatas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63107.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63107</wfw:commentRss><description>Ρε παιδιά, μήπως υπάρχει και το απλό ενδεχόμενο να μην φτάνει η μνήμη γιατί μπορεί το κάθε αντικείμενο να είναι μεγάλο σε μέγεθος; Αν είναι το κάθε ένα 10K, τότε μιλάμε για 8 GB μόνο για να μπούνε στην μνήμη!&amp;nbsp;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;800.000 instances, 20.000 γραμμές κώδικα... bloated κατάσταση μου μυρίζει και μάλλον είναι θέμα ανάλυσης/σχεδιασμού.&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63106.aspx</link><pubDate>Tue, 08 Feb 2011 20:48:38 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63106</guid><dc:creator>fanisg</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63106.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63106</wfw:commentRss><description>@cap:&lt;div&gt;Ναι, χρησιμοποιώ διπλότυπες τιμές που δεν χρειάζονται, μέχρι αποδείξεως του εναντίον. Π.χ. 2 τρίγωνα που μοιράζονται την ίδια κορυφή. Θα μπορούσε το 2ο να πάρει το σημείο ως reference του πρώτου. Αν στην πορεία όμως έπρεπε τα τρίγωνα να "ξεκολλήσουν" ή ακόμα χειρότερα το 1ο να διαγραφεί;&amp;nbsp;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63104.aspx</link><pubDate>Tue, 08 Feb 2011 20:44:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63104</guid><dc:creator>fanisg</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63104.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63104</wfw:commentRss><description>Δεν το θεώρησα χαζή ερώτηση! Απλά δεν ξέρω αν θα μπορούσε να γίνει &amp;amp; αλλιώς. Structures γενικά δεν χρησιμοποιώ. Ο profiler είναι της SCITECH (.NET Memory Profiler).&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ο κώδικας των συνδεδεμένων κλάσεων είναι &amp;gt;20.000 γραμμές, γενικά "δουλειά" του είναι να παράγει νέες χωρικές οντότητες. Το πρόβλημά μου είναι αν πρέπει ή όχι να κάνω εξ'ολοκλήρου references ή clone.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αν το refernce γεννάει αντικείμενα τότε η μόνη λύση είναι το clone?&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63103.aspx</link><pubDate>Tue, 08 Feb 2011 20:41:48 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63103</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63103.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63103</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;fanisg:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;1. New γίνεται σε κάθε αρχικοποίηση στιγμιοτύπου (υποχρεωτικά;)&lt;div&gt;2. Το Clone το χρησιμοποιώ συνειδητά μόνο σε ορισμένες περιπτώσεις, όπου ακολουθεί με το πέρας εκκαθάριση και =nothing.&lt;/div&gt;&lt;div&gt;3. Απ'όσο γνωρίζω όχι.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Δεν χρησιμοποιώ καθόλου unmanaged resources, com objects, dll &amp;amp; activex περασμένων τεχνολογιών. Αλλά πλέον δεν είμαι σίγουρος αν κάνω καλά...!&lt;/div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το σφάλμα σου είναι ότι προσπαθείς να περάσεις γνώσεις και συνήθειες ενός τελείως διαφορετικού περιβάλλοντος (VB6) στο .NET. Δεν έχει πρόβλημα το .ΝΕΤ αλλά ο τρόπος (ακόμα δεν μας έδειξες τον κώδικα) που το χρησιμοποιείς. Ο Garbage Collector φτιάχτηκε ακριβώς για να ΜΗΝ χρειάζεται να ψαχουλεύεις που να σβήσεις αντικείμενα. Αν δεν καταλαβαίνεις πως δουλεύει και προσπαθείς να τον "αναγκάσεις" να συμπεριφερθεί όπως νομίζεις, θα έχεις πρόβλημα. Για παράδειγμα, μήπως κοιτάς τη μνήμη πριν προλάβει ο GC να τρέξει? Αν δεν υπάρχει βαρειά χρήση μνήμης στο μηχάνημα ο GC δεν τρέχει (γιατί να το κάνει?) για να μην σπαταλήσει CPU. Όταν χρειαστεί το κάνει.&amp;nbsp;Εδώ που τα λέμε, και σε Java ή σε C++ με garbage collection library αν δούλευες, θα αντιμετώπιζες παρόμοια προβλήματα μέχρι να αφήσεις τον GC να δουλέψει.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αντί να προσπαθείς να περάσεις παλιό κώδικα σε νέο περιβάλλον, φτιάξε μερικές απλές εφαρμογές για να δεις πως δουλεύει το .NET. Για να λύσεις τις απορείες σου για το memory deallocation, φτιάξε ένα απλό console app και βάλε μέσα μία λίστα με 800.000 αντικείμενα. Καθάρισε τη και δες πως και πότε καθαρίζεται η μνήμη. Έτσι θα απομονώσεις το πρόβλημα και δεν θα έχεις τις παρεμβολές όλης της υπόλοιπης εφαρμογής.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Πρόβλημα με την απελευθέρωση μνήμης στη VB.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63102.aspx</link><pubDate>Tue, 08 Feb 2011 20:38:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63102</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63102.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=63102</wfw:commentRss><description>Συνεχίζω να υποψιάζομαι πρόβλημα "ζωντανών" references πάντως. Δυστυχώς δεν μπορώ να αναπτύξω το συλλογισμό μου παραπάνω και να επιβεβαιώσω την υποψία μου χωρίς να έχω source code.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ερώτηση - σκέψη (στο μοτίβο σκέψης του flyweight): Ολα τα instances τα χρειάζεσαι ως ξεχωριστά; Μήπως χρησιμοποιείς νέα στιγμιότυπα με εντελώς διπλότυπες τιμές χωρίς να είναι απαραίτητο να το κάνεις; Μήπως ένας "κουβάς" που θα ελέγχει αν το στιγμιότυπο που ζητάς υπάρχει ήδη και θα σου δίνει reference σε αυτό αντί για ένα νέο θα σου μείωνε τον αριθμό;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description></item></channel></rss>