[ Cola @ 13.10.2008. 19:34 ] @
Pozz svima.

Nije mi baš jasno da li će garbage collector da pokupi smeće iza mene u sledećoj situaciji pa molim nekoga ko zna da objasni (meni i svima koji ne znaju).
Najjednostavniji primer je lista npr ako više ne želim da je koristim, da li je dovoljno referencu na glavu liste stavim na null, tj da nemam više referencu na nju, da li će se GC postarati oko cele liste?
Šta ako je lista bila cirkularna? Da li će i tada da obriše jer zadnji ima referencu na prvi?

Još bolji primjer je stablo podataka. Pa npr ako treba da "potkrešem" to stablo tj odbacim neke grane, da li je dovoljno da zaboravim na root reference te grane i da se GC pobrine za njih (sve grene i grančice tog podstabla)?

Hvala
[ Igor Gajic @ 13.10.2008. 21:51 ] @
GC radi tako sto prvo oznaci da je sve ne-referencirano("mrtvo") i onda prolazi kroz sve objekte u steku, tj. objekte kojima se moze pristupiti iz programa, ukoliko im se moze pristupiti on ih obelezi kao "zive", tj. upotrebljive. S obzirom da na pomenute strukture podataka vise ne postoji referenca iz programa oni ce i dalje biti oznaceni "za brisanje" iako referenciraju jedni na druge. Mislim da je suvise trivijalan problem da bi ovi M$-a to prevideli.

Tako da je odgovor da, samo trebas da postavis referencu na null i GC objekat vidi kao "collectable", tj. moze da se brise.
[ Cola @ 14.10.2008. 22:19 ] @
OK tako sam i mislio
No hajde sada malo da usložnimo stvari
šta ako je u pitanju stablo ali koje može imati i cirkularne reference, da više grana pokazuje na isti čvor tj da ne bude klasično stablo.
Ukoliko tada zaboravim na root moguće je da će neka grana pokazivati na njega. I u ovom slučaju nema pristup iz programa oni su u memoriji ali su uvezani u "to čudno" stablo (kako ga ja od milja zovem žbun )

Da li će i tada on znati da razreši problem?
[ Igor Gajic @ 14.10.2008. 23:04 ] @
Pa po tvom opisu, opet ce nega grana u tom zbunu imati pokazivac na "obrisani" cvor, tj nisi ga obrisao u potpunosti, i opet imas neku referencu na njega iz programa.

E sad, SAVRSEN automatizovan garbage collector ne postoji niti ce postojati, uvek moze da se nadje situacija u kojoj GC nece raditi korektno.
[ mmix @ 15.10.2008. 09:34 ] @
Eh, ne mozes zeznuti GC na te jeftine fore

Pogledaj sledece blogove za vise objasnjenja (posto GC nije standardizovan, svaki release ima svoj GC)

I Am a Happy Janitor – Part 1: Finding garbage

How does the GC work and what are the sizes of the different generations?
Na kraju ovog bloga imas jos linkova ka detaljima, u principu tessin blog je odlican za sve koji hoce ozbiljnije da se bave debugom .NETa.
[ Cola @ 17.10.2008. 16:11 ] @
Citat:
Igor Gajic: Pa po tvom opisu, opet ce nega grana u tom zbunu imati pokazivac na "obrisani" cvor, tj nisi ga obrisao u potpunosti ...


Da imaće pokazivač na obrisani čvor, ali ako sam ja "žbunu" imao pristup samo preko jedne tačke, tj tog root elementa kada njega obrišem više neću imati pristup nijednom elementu tako da bio on (root, ali i celi žbun) teoriski trebao biti za brisanje.

Citat:
mmix: Eh, ne mozes zeznuti GC na te jeftine fore ;)
...


Hehe pa nije mi ga cilj zeznuti :) baš nasuprot cilj bi mi bio da se on pobrine na smeće koje ostane iza mene pa me zato zanima da li će se on snaći, jer ako neće onda ja moram razbijati glavu da to razrešim tj, da odpetljam "žbun" i poskidam sve reference tako da onda on zna da se oslobodi :)
[ mmix @ 19.10.2008. 14:43 ] @
I bice obrisan jer vise nije dostupan (vidi onaj blog I'm a happy janitor)

Ne moras uopste da se maltretiras oko tih stari jer ce GC savrseno dobro obaviti svoj posao. Jedino sto ti treba da osiguras je da ako objekat implementira Disposable patter, da pozoves Dispose pre nego referenca "nestane" jer nikad ne mozes da znas u kojoj generaciji ti se nalazi objekat i da li ce mozda biti pociscen tek na kraju izvrsavanja programa.