Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    12

    [c#] Garbage collection, null e marshalling

    salve,
    ho scritto un codicillo che per esigenze fa partire un thread, all'interno di questo thread vengono create delle variabili e delle connessioni con outlook tramite l'interop.
    Il tool rimane acceso 24/7 e fa polling su una casella mail pubblica trappando mittente e argomento, se questi soddisfano alcune condizioni vengono trattate inserendo i vari dati in un DB MySql.
    A valle della trattazione provvedo a mettere tutte le stringhe a null e a fare il dispose degli oggetti disposable, ed in fondo al codice mi è stato suggerito di aggiungere

    codice:
    System.Runtime.InteropServices.Marshal.ReleaseComObject(Mitem);
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Mitem);
    Naturalmente Mitem è il mio oggetto MAIL dell'interop e mi è stato suggerito di aggiungere una forzatura al GarbageCollection che per farla eseguire ogni 10 mail ho pensato di fare così:

    codice:
    if (nummail==10)
    {
        nummail=0;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
    nummail++
    Procedura comunque ripetuta a valle delfinally

    Ho notato che comunque il programma tende a crescere in memoria anche se di pochi K per volta.

    Ho alcune domande a questo punto:

    1) Se faccio il .dispose(); è necessario anche fare = null; ?
    2) Se si in che ordine?
    3) So che il GC non andrebbe forzato ma il tool "mangia" molta più memoria senza, come posso ovviare?
    4) Il marshalling cosa fa di preciso?


    grazie in anticipo per le risposte!!

  2. #2
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249

    Re: [c#] Garbage collection, null e marshalling

    Originariamente inviato da ebaccini
    1) Se faccio il .dispose(); è necessario anche fare = null; ?
    no

    Originariamente inviato da ebaccini
    3) So che il GC non andrebbe forzato ma il tool "mangia" molta più memoria senza, come posso ovviare?
    Non puoi farci niente! si arrangia il framework a liberare la memoria.

    Originariamente inviato da ebaccini
    4) Il marshalling cosa fa di preciso?
    Il marshalling non serve per liberare spazio. Il marshalling di un oggetto è una trasformazione di un oggetto.


    Nota anche che le chiamate
    System.Runtime.InteropServices.Marshal.ReleaseComO bject(Mitem);
    System.Runtime.InteropServices.Marshal.FinalReleas eComObject(Mitem);

    Non servono a niente in quanto è il wrapper dell'oggetto com a liberare la memoria.

    Secondo me non si può fare niente...
    I got the remedy

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    12
    ti ringrazio per la risposta,
    a quanto dici però non c'è verso di limitare il crescere dell'occupazione della memoria?

    A questo punto mi viene in mente che potrei far partire un processo dal main che chiude e riapre il programma stesso.... un po complicato però.... spero ci sia una maniera più pulita in qualche modo...

  4. #4
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da ebaccini
    ti ringrazio per la risposta,
    a quanto dici però non c'è verso di limitare il crescere dell'occupazione della memoria?

    A questo punto mi viene in mente che potrei far partire un processo dal main che chiude e riapre il programma stesso.... un po complicato però.... spero ci sia una maniera più pulita in qualche modo...
    Per quanto riguarda l'occupazione della memoria da parte del com non puoi fare niente.
    Può anche essere che la parte programmata da te abbia dei memory leak ma questo chiaramente non lo so...
    Chiudere e riaprire il programma, scusa se te lo dico ma è una porcata
    I got the remedy

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    12
    Originariamente inviato da albgen
    Chiudere e riaprire il programma, scusa se te lo dico ma è una porcata
    Sono perfettamente d'accordo... è per questo che non vorrei farlo

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da ebaccini
    Sono perfettamente d'accordo... è per questo che non vorrei farlo

    quindi in definitiva, secondo me oltre che chiamare GC.Collect() non puoi fare tanto....
    I got the remedy

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Re: [c#] Garbage collection, null e marshalling

    Originariamente inviato da ebaccini
    Ho notato che comunque il programma tende a crescere in memoria anche se di pochi K per volta.
    Il fatto che "tenda" non è detto che cresca all'infinito: hai provato a lasciarlo in esecuzione per un tempo sufficientemente lungo per vedere se l'occupazione di memoria eccede limiti accettabili?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    12
    L'ho lasciato andare per una settimana ma non sono riuscito a prendere misure perché il PC sul quale stava girando ha crashato. Al termine del recover con un po di TS alcuni colleghi hanno visto che non era dovuto al programma ma che per prevenzione vista la tendenza a crescere e la premessa di rimanere 24/7 attivo in un ambiente privo di tecnici o persone che hanno dimestichezza con le macchine si è convenuto che se si riesce a mantenere un consumo di memoria stabile è meglio, il che, ovviamente, arrivato all'orecchio del direttore è diventato mandatorio.
    Quindi eccomi qui.
    La crescita comunque è di 500 Kb/h (da 9Mb è arrivato a 30.944 Kb e dopo un ora era a 31.116 Kb) e sinceramente per poche centinaia di righe di codice e un accesso alla memoria ancor più lesinato mi sembrano comunque misure eccessive... è per questo che cerco un modo per scaricare le varabili e i moduli dalla memoria ad ogni ciclo....

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da ebaccini
    La crescita comunque è di 500 Kb/h (da 9Mb è arrivato a 30.944 Kb e dopo un ora era a 31.116 Kb) e sinceramente per poche centinaia di righe di codice e un accesso alla memoria ancor più lesinato mi sembrano comunque misure eccessive... è per questo che cerco un modo per scaricare le varabili e i moduli dalla memoria ad ogni ciclo....
    Non puoi profilare l'occupazione di memoria in questo modo: magari parte da 9 mega, dopo un'ora passa a 30 mega, e dopo 10 ore passa a 31.

    Il .NET Framework è per definizione un sistema non lineare, a differenza dei sistemi nativi (ad esempio, quello che si ha con gli applicativi C++ e Delphi), quindi non puoi basarti su queste oscillazioni in brevi periodi per stabilire quanto cresce l'occupazione di memoria.

    O cerchi un profiler che possa permetterti di fare una diagnostica seria in merito, oppure costruisci un ambiente di test e verifichi effettivamente l'uso della memoria nella pratica lasciando in esecuzione l'applicazione per ore e giorni (con un minimo di monitoring delle risorse, ovviamente, per avere dati sull'evoluzione anche in caso di crash).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    12
    Capisco, probabile mia inesperienza a riguardo.

    Provo a descrivere in poche righe la struttura del programma magari ho commesso qualche errore strutturale:

    il form ha due tast che servono solo a fare lo start e stop del thread "DEMONE" che ogni 180000 msec (2 min e mezzo) effettua un polling su una cartella condivisa aprendone tutti gli oggetti mail e lavorando solo quelli arrivati da un determinato indirizzo. Dopo questa scrematura c'è una biforcazione in base al soggetto della mail e, se non ci sono mail che soddisfano una di queste due condizioni,il thread ricomincia il ciclo con la pausa.
    Se le condizioni vengono soddisfatte il thread passa i dati parsati ad un db mysql.
    Partendo dal presupposto che non uso DSN a causa della mancata uniformità delle macchine in azienda, e dal fatto che quando creo le stringhe poi le nullo nel finally, le uniche cose che istanzio di volta in volta sono gli oggetti dell'interop, anche se poi ho cura di nullarli. La mia paura è che nonostante queste cure nello scaricare variabili e oggetti sia insita nella logica che uso una istanziazione a catena di un qualche oggetto che non viene nullato.

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.