Page 1 of 1
Garbage Collector
Posted: Tue Dec 11, 2007 1:21 am
by Zifnab
Μετακινήθηκε από εδώ
----------------------
Εγώ άφησα το Date κατα λάθος μετά από την απλούστευση του προγράμματος μου(το οποίο το χρησιμοποιεί) για να γίνει σαφής η ερώτηση...
Ξύνετε πληγές οπότε να τι έγινε τώρα...
Το gc δουλεύει μή-ντετερμινιστικά έτσι? Ενεργοποιείται πότε ακριβώς π.χ πιο συχνά όταν τελειώνει η μνήμη της VM (Java Stack)?
Είναι ανάγκη να κάνουμε τα αντικείμενα μας null, ή γίνεται αυτόματα μόλις βγούν out of scope?
Υπάρχει τρόπος να κάνουμε customize το gc στην java? φυσικά δεν μιλάω για το System.gc() που μάλλον άχρηστο φαντάζει στα μάτια μου...
Κάτι ακόμα:
Ένα αντικείμενο class A που έχει δείκτες προς τρία αντικείμενα class Β, όταν γίνει collect από τον gc θα γίνουν collect και τα τρία αντικείμενα Β, αν δεν είναι δεσμευμένα? Υπάρχει περίπτωση εκτός του ότι κάποιος δείκτης υπάρχει που δείχνει στο A, o gc να μην μπορεί να τον κάνει collect?
Ευχαριστώ εκ των προτέρων

Posted: Tue Dec 11, 2007 7:11 am
by HdkiLLeR
Zifnab wrote:
Το gc δουλεύει μή-ντετερμινιστικά έτσι? Ενεργοποιείται πότε ακριβώς π.χ πιο συχνά όταν τελειώνει η μνήμη της VM (Java Stack)?
Εδώ μάλλον εννοείς το αντίθετο

. Ντετερμινιστικά δουλεύει γιατί στηρίζεται σε κάποιον αλγόριθμο άρα πάντα το ίδιο θα κάνει και με τον ίδιο τρόπο (αυτά φιλοσοφικά περί ντετερμινισμού). Τώρα για την ερώτηση, ο garbage collector κάνει deallocate τα dynamic objects (ότι έχει γίνει allocate με τον τελεστή
new). Συνεπώς κάνει free από το heap και όχι απο το stack. Όσον αφορά τώρα το θέμα του πότε καλείται αυτό έχει αλλάξει με τις διάφορες εκδόσεις της JVM. Παλιότερα ήταν ανάλογα με το reference counting, καθώς εξελίσεται η jvm αλλάζει και αυτός. Μπορείς να δεις κάποια για το
gc της Java εδώ:
http://www.ibm.com/developerworks/java/ ... -jtp10283/
Zifnab wrote:
Είναι ανάγκη να κάνουμε τα αντικείμενα μας null, ή γίνεται αυτόματα μόλις βγούν out of scope?
Εάν θέλεις κάτι να γίνει deallocate σίγουρα πρέπει να είναι null
το σύνολο των references που δείχνουν σε αυτό. Με το να βγεί out of scope κάτι δεν θα κληθεί ο gc (τουλάχιστον μέχρι τον gc της 1.3 -- που δεν νομίζω ότι έχει αλλάξει σημαντικά στις επόμενες εκδόσεις).
Zifnab wrote:
Υπάρχει τρόπος να κάνουμε customize το gc στην java? φυσικά δεν μιλάω για το System.gc() που μάλλον άχρηστο φαντάζει στα μάτια μου...
Υπάρχουν αρκετά options για να κάνεις fine-tune τον gc ανάλογα με το application σου. Ειδικά για time sensitive εφαρμογές το garbage collection είναι σημαντικό overhead. Μπορείς να δεις κάποια πράγματα εδώ:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Zifnab wrote:
Κάτι ακόμα:
Ένα αντικείμενο class A που έχει δείκτες προς τρία αντικείμενα class Β, όταν γίνει collect από τον gc θα γίνουν collect και τα τρία αντικείμενα Β, αν δεν είναι δεσμευμένα? Υπάρχει περίπτωση εκτός του ότι κάποιος δείκτης υπάρχει που δείχνει στο A, o gc να μην μπορεί να τον κάνει collect?
Εάν δεν υπάρχουν references και στα τρία αντικείμενα του class Β τότε ναι θα γίνουν deallocate και αυτά. Εάν κάποιο είναι referenced απο κάπου αλλού αυτό δεν θα γίνει. Όπως είπα και πιο πρίν παραδοσιακά χρησιμοποιείται ο μηχανισμός του reference counting για να κληθεί o gc και παραμένει ο πιο βασικός μηχανισμός. Οπότε εάν όλα τα references σε ένα object είναι 0 τότε την επόμενη φορά που θα κληθεί ο gc θα ελευθερώσει και τον χώρο γι' αυτό το object.
Posted: Tue Dec 11, 2007 9:33 am
by tsilochr
Σε αυτού του επιπέδου γλώσσες (Java, C#) που έχεις διαχείρηση μνήμης από τον garbage collector υπάρχουν κάποια παραθυράκια για να τον καλέσεις ρητά. Πχ στην Java μπορείς να καλέσεις τον σκουδιάρη να έρθει και να μαζέψει με την System.gc().
Επιπλεόν, κάθε αντικείμενο κληρονομεί από την Object την μέθοδο Finalize. Είναι μια μέθοδος που καλεί ο GC πριν πετάξει το αντικείμενο στα σκουπίδια. Μπορείς λοιπόν να υπερφορτώσεις την εν λόγω μέθοδο να κάνει 1-2 πραματάκια κατά την καταστροφή του object, αλλά προσοχή: δεν είναι destructor. Μονο ο GC ελευθερώνει μνήμη. H μέθοδος Finalize καλέιται για κάθε object από τον GC αλλά μπορείτε να αναγκάσετε τον GC να τρέξει τις Finalize με την κλήση System.runFinalization().
Συνήθως χρειάζεται να απελευθερώνεις μνήμη όταν παίζεις με GUI όπου εκεί τα components έχουν την μέθοδο dispose. Γενικά, αν κάνετε λίγο google θα δείτε ότι ενώ υπάρχουν τρόποι να μλήσεις στον Garbage Collector, καλύτερα να μην μπλέξεις
Posted: Tue Dec 11, 2007 9:50 am
by Zifnab
Ευχαριστώ πολύ παιδιά! Όσον αφορά περί μη ντετερμινισμού νομίζω ήταν λόγια του Punisher...Σωστά? Στην C# έχουμε διαφορές στην υλοποίηση του gc όπως και στην java? (σκέφτομαι να το σπάσω το topic

) Και ωραία γιατί να υπάρχει η System.gc() αφού πρακτικά δεν θα έρθει εκείνη τη στιγμή που την καλείς? Και πόσο θα περίμενε π.χ για το Date στο πρόγραμμα μου για να το κάνει deallocate? Πως ήξερε τι θα γινόταν 1000γραμμές πιο κάτω?
Υ.Γ δεν έχω δει τα links που παρέθεσες Hd
Posted: Tue Dec 11, 2007 11:40 am
by tsilochr
Μωρέ υπάρχει στιγμή που την καλείς, αλλά όταν κάνεις πολύ critical δουλειές και ξέρεις τι και πως γίνεται μέσα στο κώδικα σου. Κοινώς, είναι για πεπειραμένους.
Και στην C# πάνω κάτω τα ίδια είναι. Το ΑΡΙ είναι σχεδόν το ίδιο. Επίσης να ξέρεις ότι υπάρχουν garbage collection βιβλιοθήκες και για C++!!!
Δες τα links του hd. Εξηγούν πότε και πως και γιατί! Επίσης zifnab, μιας και κάνεις κατανεμημένα, θα κάνετε μια διάλεξη πάνω σε distributed garbage collection (μάλιστα μπορεί να είναι και θέμα στις εξετάσεις)
Posted: Tue Dec 11, 2007 9:12 pm
by Zifnab
είναι η επόμενη παρασκευή αυτή η διάλεξη με κύριο θέμα Java RMI και κυρίως distr. gc
Οκ tsilo απλά λέγανε στην microsoft ότι ο gc της C# είναι πολύ βελτιωμένος σε σχέση με της java γιαυτό το ανέφερα...
Posted: Wed Dec 12, 2007 1:55 am
by The Punisher
When a Java program runs, a portion of most JVMs known as the garbage collector runs as a background thread to perform garbage collection. Because that thread runs occasionally at nondeterministic times, you do not know when it will run. (I will cover threads in a future article.)
[via]
For garbage collection systems that run as a background task, this loss of control can escalate into a potentially more serious problem for some types of applications because it introduces what is essentially nondeterministic behavior into a program. A garbage collector that executes in the background reclaims unused memory at times that are, for all practical purposes, unknowable. For example, the collector will usually run only when free CPU time is available. Because this might vary from one program run to the next, from one computer to next, or from one operating system to the next, the precise point in program execution at which the garbage collector executes is effectively nondeterministic. This is not a problem for many programs, but it can cause havoc with real-time applications in which the unexpected allocation of CPU cycles to the garbage collector could cause an event to be missed.
[via]
Nondeterministic pauses in traditional garbage collection (GC) have inhibited Java™ technology from being a suitable environment for real-time (RT) development. Metronome GC -- part of IBM® WebSphere® Real Time -- provides deterministic GC behavior that, when combined with other features, enables developers to write hard RT applications in the Java language. The authors describe the approach that Metronome uses for deterministic GC, technical issues involved in developing Metronome, and the tools and facilities available for tuning GC.
[via]
Zifnab wrote:Όσον αφορά περί μη ντετερμινισμού νομίζω ήταν λόγια του Punisher...Σωστά?
Λόγια δικά μου λογικά. Το είχες ψάξει κι εσύ όμως ...

Posted: Wed Dec 12, 2007 11:11 am
by Zifnab
Ωραίος Punisher... Έιχα σκοπό να το σπάσω το topic όπως έλεγα σε προηγούμενο post. Τώρα έχουμε ήσυχη την συνείδηση ότι είμαστε ontopic

Άρα τι έχουν να πουν οι παλιοί μετα από αυτό το μηντετερμινιστικοστρεφές μήνυμα περί GC

?
Posted: Wed Dec 12, 2007 11:40 am
by Tomahawk
Re:
Posted: Fri Dec 21, 2007 2:39 am
by HdkiLLeR
tsilochr wrote:Πχ στην Java μπορείς να καλέσεις τον σκουδιάρη να έρθει και να μαζέψει με την System.gc().
Πέρασα το links του Χάρη λίγο γρήγορα, γιατί σήμερα το forum έχει του κόσμου τις αλλαγές, οπότε μπορεί να έχει αναλυθεί και εκεί αλλά η
System.gc() είναι απλά ένα request για garbage collection το οποίο γίνεται scheduled για κάποια στιγμή στο μέλλον! Δεν καλείται εκείνη την στιγμή. Μπορείς πολύ εύκολα με έναν profiler να δεις πότε ελευθερώνεται στην πραγματικότητα memory και πότε γίνεται collection.
Re: Re:
Posted: Fri Dec 21, 2007 6:41 pm
by netharis
HdkiLLeR wrote:
Μπορείς πολύ εύκολα με έναν profiler να δεις πότε ελευθερώνεται στην πραγματικότητα memory και πότε γίνεται collection.
Έψαξα λίγο και βρήκα οτι μπορείς να τρέξεις το class της Java με συγκεκριμένη παράμετρο, έτσι ώστε να δημιουργήσει ένα file με τις πληροφορίες που θες.
Code: Select all
java -Xrunhprof:cpu=samples,depth=30,file=stats.hprof application
To hprof που θα περιέχει τα στοιχεία που χρειαζόμαστε (resources κτλ) πως το κάνουμε customize να μας δώσει συγκεκριμένα στοιχεία; Τρέχοντας μια απλή εφαρμογή, το output του hprof ήταν λίγο αχανές. Πως θα αναγνωρίζουμε κάτω απο τα trace πότε εκτελείται ο gc ;