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.