Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [C#] Garbage collection

    Ma praticamente un oggetto quando viene eliminato?
    So che il garbage collection periodicamente controlla gli elementi da eliminare, ma come faccio a dire quali sono?
    Semplicemnte basta che nessuna variabile punti più all'oggetto?

    Quando il garbage cancella l'oggetto, che cosa invoca in pratica? Dispose, Finalize o il distruttore ~Classe?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da Pasalino
    Ma praticamente un oggetto quando viene eliminato?
    So che il garbage collection periodicamente controlla gli elementi da eliminare, ma come faccio a dire quali sono?
    Semplicemnte basta che nessuna variabile punti più all'oggetto?
    Esattamente. Il Garbage Collector usa un algoritmo generazionale e tiene traccia dei riferimenti agli oggetti; quando un oggetto non è referenziato, è passibile di distruzione da parte del GC.

    Originariamente inviato da Pasalino
    Quando il garbage cancella l'oggetto, che cosa invoca in pratica? Dispose, Finalize o il distruttore ~Classe?
    Quando la classe implementa l'interfaccia IDisposable, viene richiamato il metodo Dispose.

    P.S.: le domande su C# vanno nell'apposito sottoforum dedicato al .NET Framework. Sposto la discussione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di biste
    Registrato dal
    Apr 2001
    Messaggi
    877

    Re: [C#] Garbage collection

    Ma praticamente un oggetto quando viene eliminato?
    Non è possibile saperlo, in quanto la garbage collection non è deterministica; accontentati di sapere che a un certo punto interverrà

    So che il garbage collection periodicamente controlla gli elementi da eliminare, ma come faccio a dire quali sono?
    Semplicemnte basta che nessuna variabile punti più all'oggetto?
    Il GC traccia quali sono in memoria gli oggetti non più referenziati e quindi non più utilizzati.

    Quando il garbage cancella l'oggetto, che cosa invoca in pratica? Dispose, Finalize o il distruttore ~Classe?
    Invoca il metodo Finalize (VB.NET) o ~Classe (C#)

    Per predisporre un oggetto per la garbage collection è necessario chiamare il metodo Dispose per tutti gli oggetti utilizzati che lo espongono (e che quindi implementano l'interfaccia IDisposable). Nel metodo Dispose vengono rilasciate sia le risorse managed che unmanaged utilizzate dall'oggetto, nel Finalize _solo_ quelle unmanaged.
    UGIdotNET
    Microsoft .NET MCAD
    C++, C#, VB6, VB.NET, ASP, ASP.NET
    SQL Server 2000

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da biste
    Invoca il metodo Finalize (VB.NET) o ~Classe (C#)

    Per predisporre un oggetto per la garbage collection è necessario chiamare il metodo Dispose per tutti gli oggetti utilizzati che lo espongono (e che quindi implementano l'interfaccia IDisposable). Nel metodo Dispose vengono rilasciate sia le risorse managed che unmanaged utilizzate dall'oggetto, nel Finalize _solo_ quelle unmanaged.
    Giusta precisazione, in quanto a volte confondo Finalize, Dispose e i "distruttori".

    Programmando con Delphi, sono abituato alla distruzione deterministica che, tra l'altro, permane anche su Delphi.NET con la stessa identica sintassi (sebbene non faccia altro che richiamare Dispose se l'oggetto implementa IDisposable), lasciando al GC l'unico compito di distruggere l'istanza dell'oggetto in esame.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    mmmmm io non ho mai capito se faccio bene a richiamare il dispose di un oggetto e poi successivamente impostarlo a Nothing.

    In teoria cosi dovrei liberare subito le risorse senzaspettare il gc ,o sbaglio ???.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da cassano
    mmmmm io non ho mai capito se faccio bene a richiamare il dispose di un oggetto e poi successivamente impostarlo a Nothing.

    In teoria cosi dovrei liberare subito le risorse senzaspettare il gc ,o sbaglio ???.
    E' sempre il GC che distrugge gli oggetti, non c'è modo di aggirarlo.

    Impostare una variabile a Nothing può servire solamente a rendere un oggetto passibile di distruzione un po' prima, ma non credo che tu possa notare effetti sul tuo codice a parte quello di avere un sorgente inframezzato di tanti assegnamenti a Nothing che, alla fine, sporcano il codice e non ottengono alcun esito.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In realta' si puo' "forzare" il GC ad effettuare il proprio lavoro.

    Se un oggetto e' candidato ad essere distrutto dal GC, invece che aspettare il suo intervento, lo si puo' richiedere esplicitamente.

    Ma e' una tecnica sconsigliata in quanto cosi' facendo si interferisce pesantemente su un processo molto complesso, che ha degli equilibri particolari determinati, anche, dal fatto che interviene solo in determinate situazioni.

    La GC e', evidentemente, un'operazione molto pesante e, se eseguita "forzatamente" ogni volta lo si voglia, puo' pregiudicare le prestazioni di tutto il sistema.

  8. #8
    Utente di HTML.it L'avatar di biste
    Registrato dal
    Apr 2001
    Messaggi
    877
    Originariamente inviato da alka
    E' sempre il GC che distrugge gli oggetti, non c'è modo di aggirarlo.

    Impostare una variabile a Nothing può servire solamente a rendere un oggetto passibile di distruzione un po' prima, ma non credo che tu possa notare effetti sul tuo codice a parte quello di avere un sorgente inframezzato di tanti assegnamenti a Nothing che, alla fine, sporcano il codice e non ottengono alcun esito.

    Ciao!
    Dipende perché questo che dici è assolutamente vero con il Framework di MS, mentre non lo è (o almeno non lo era finché ci "lavoravo") su Mono dove esplicitare l'impostazione a Nothing (null) di un oggetto poteva avere l'effetto contrario, ovvero tardarne la finalizzazione.
    Comunque sono dettagli, in generale concordo con te.

    P.S. Non sapevo che Delphi.NET avesse garbage collection deterministica, beati voi
    Ora il nuovo C++/CLI l'avrà e la cosa è decisamente interessante
    UGIdotNET
    Microsoft .NET MCAD
    C++, C#, VB6, VB.NET, ASP, ASP.NET
    SQL Server 2000

  9. #9
    Utente di HTML.it L'avatar di biste
    Registrato dal
    Apr 2001
    Messaggi
    877
    Originariamente inviato da oregon
    In realta' si puo' "forzare" il GC ad effettuare il proprio lavoro.

    Se un oggetto e' candidato ad essere distrutto dal GC, invece che aspettare il suo intervento, lo si puo' richiedere esplicitamente.

    Ma e' una tecnica sconsigliata in quanto cosi' facendo si interferisce pesantemente su un processo molto complesso, che ha degli equilibri particolari determinati, anche, dal fatto che interviene solo in determinate situazioni.

    La GC e', evidentemente, un'operazione molto pesante e, se eseguita "forzatamente" ogni volta lo si voglia, puo' pregiudicare le prestazioni di tutto il sistema.
    Attenzione che chiamare esplicitamente GC.Collect non vuol dire necessariamente che i finalizzatori verranno chiamati e che sarà liberata memoria. Sono d'accordo con te sul fatto di lasciare comunque che sia il GC a decidere quando intervenire evitando di chiamarlo esplicitamente: uno dei problemi più banali che potresti avere è che oggetti che verrebbero finalizzati da lì a breve vengano promossi in generazioni successive.

    Consiglio la lettura di questo articolo:
    http://www.ugidotnet.org/articles/ar...ead.aspx?ID=53
    UGIdotNET
    Microsoft .NET MCAD
    C++, C#, VB6, VB.NET, ASP, ASP.NET
    SQL Server 2000

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da biste
    P.S. Non sapevo che Delphi.NET avesse garbage collection deterministica, beati voi
    Infatti non ce l'ha.

    Il linguaggio Delphi per Win32 ha una distruzione deterministica e si ottiene chiamando il metodo Free di qualsiasi oggetto.

    Attraverso i Class Helper, una feature di Delphi (brevettata), questo metodo è presente anche per qualsiasi System.Object nel linguaggio Delphi.NET, che è lo stesso Delphi di Win32 ma produce applicazioni in codice intermedio. Però, richiamando Free, si ottiene la chiamata al metodo Dispose se e solo se la classe dell'oggetto in esame implementa l'interfaccia IDisposable.

    In sostanza, il codice già scritto rimane compatibile per .NET e ha l'effetto, su questa piattaforma, di continuare ad eseguire le stesse operazioni logiche tranne per il fatto che la memoria vera e propria dell'oggetto, in ultimo, viene rilasciata dal GC.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.