Garbage Collector

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Garbage Collector

Post by Zifnab » Tue Dec 11, 2007 1:21 am

Μετακινήθηκε από εδώ


----------------------


Εγώ άφησα το Date κατα λάθος μετά από την απλούστευση του προγράμματος μου(το οποίο το χρησιμοποιεί) για να γίνει σαφής η ερώτηση...

Ξύνετε πληγές οπότε να τι έγινε τώρα... :-D

Το gc δουλεύει μή-ντετερμινιστικά έτσι? Ενεργοποιείται πότε ακριβώς π.χ πιο συχνά όταν τελειώνει η μνήμη της VM (Java Stack)?
Είναι ανάγκη να κάνουμε τα αντικείμενα μας null, ή γίνεται αυτόματα μόλις βγούν out of scope?
Υπάρχει τρόπος να κάνουμε customize το gc στην java? φυσικά δεν μιλάω για το System.gc() που μάλλον άχρηστο φαντάζει στα μάτια μου...
Κάτι ακόμα:
Ένα αντικείμενο class A που έχει δείκτες προς τρία αντικείμενα class Β, όταν γίνει collect από τον gc θα γίνουν collect και τα τρία αντικείμενα Β, αν δεν είναι δεσμευμένα? Υπάρχει περίπτωση εκτός του ότι κάποιος δείκτης υπάρχει που δείχνει στο A, o gc να μην μπορεί να τον κάνει collect?

Ευχαριστώ εκ των προτέρων :cool:
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Tue Dec 11, 2007 7:11 am

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.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Tue Dec 11, 2007 9:33 am

Σε αυτού του επιπέδου γλώσσες (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, καλύτερα να μην μπλέξεις
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Tue Dec 11, 2007 9:50 am

Ευχαριστώ πολύ παιδιά! Όσον αφορά περί μη ντετερμινισμού νομίζω ήταν λόγια του Punisher...Σωστά? Στην C# έχουμε διαφορές στην υλοποίηση του gc όπως και στην java? (σκέφτομαι να το σπάσω το topic :-D ) Και ωραία γιατί να υπάρχει η System.gc() αφού πρακτικά δεν θα έρθει εκείνη τη στιγμή που την καλείς? Και πόσο θα περίμενε π.χ για το Date στο πρόγραμμα μου για να το κάνει deallocate? Πως ήξερε τι θα γινόταν 1000γραμμές πιο κάτω?

Υ.Γ δεν έχω δει τα links που παρέθεσες Hd
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Tue Dec 11, 2007 11:40 am

Μωρέ υπάρχει στιγμή που την καλείς, αλλά όταν κάνεις πολύ critical δουλειές και ξέρεις τι και πως γίνεται μέσα στο κώδικα σου. Κοινώς, είναι για πεπειραμένους.

Και στην C# πάνω κάτω τα ίδια είναι. Το ΑΡΙ είναι σχεδόν το ίδιο. Επίσης να ξέρεις ότι υπάρχουν garbage collection βιβλιοθήκες και για C++!!!

Δες τα links του hd. Εξηγούν πότε και πως και γιατί! Επίσης zifnab, μιας και κάνεις κατανεμημένα, θα κάνετε μια διάλεξη πάνω σε distributed garbage collection (μάλιστα μπορεί να είναι και θέμα στις εξετάσεις)
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Tue Dec 11, 2007 9:12 pm

είναι η επόμενη παρασκευή αυτή η διάλεξη με κύριο θέμα Java RMI και κυρίως distr. gc :-D

Οκ tsilo απλά λέγανε στην microsoft ότι ο gc της C# είναι πολύ βελτιωμένος σε σχέση με της java γιαυτό το ανέφερα...
The Punisher
Venus Former Team Member
Posts: 7561
Joined: Thu Oct 27, 2005 1:43 pm
Academic status: Alumnus/a
Gender:
Location: Boston, MA

Post by The Punisher » Wed Dec 12, 2007 1:55 am

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...Σωστά?
Λόγια δικά μου λογικά. Το είχες ψάξει κι εσύ όμως ... ;)
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Wed Dec 12, 2007 11:11 am

Ωραίος Punisher... Έιχα σκοπό να το σπάσω το topic όπως έλεγα σε προηγούμενο post. Τώρα έχουμε ήσυχη την συνείδηση ότι είμαστε ontopic ;) Άρα τι έχουν να πουν οι παλιοί μετα από αυτό το μηντετερμινιστικοστρεφές μήνυμα περί GC :-D ?
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Wed Dec 12, 2007 11:40 am

User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Re:

Post by HdkiLLeR » Fri Dec 21, 2007 2:39 am

tsilochr wrote:Πχ στην Java μπορείς να καλέσεις τον σκουδιάρη να έρθει και να μαζέψει με την System.gc().
Πέρασα το links του Χάρη λίγο γρήγορα, γιατί σήμερα το forum έχει του κόσμου τις αλλαγές, οπότε μπορεί να έχει αναλυθεί και εκεί αλλά η System.gc() είναι απλά ένα request για garbage collection το οποίο γίνεται scheduled για κάποια στιγμή στο μέλλον! Δεν καλείται εκείνη την στιγμή. Μπορείς πολύ εύκολα με έναν profiler να δεις πότε ελευθερώνεται στην πραγματικότητα memory και πότε γίνεται collection.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Re: Re:

Post by netharis » Fri Dec 21, 2007 6:41 pm

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 ;
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
Post Reply

Return to “Προγραμματισμός”