Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67

    Garbage collector non funziona

    salve ragazzi, ho postato una o piu discussioni in passato riguardo al GC e mi ero convinto che in effetti funzionava a dovere.

    Oggi ho integrato nel mio programma java una funzionalità che permette di caricare un foto e salvarla in un certo path. Bene, solo questa situazione mi succhia 150MB di ram....oltre al costo di tutto il resto.

    Quindi apro il task manager e guardo l'evoluzione del mio programma...continuo a lavorare, apro pannelli istanzio oggetti, chiamate al DB e cavolate varie ...ma quei 150 MB non vogliono andarsene.

    ho provato a forzare la chiamata con System.gc();
    ho provato a settare a null i miei oggetti image, ho provato a tenere 15 minuti buoni il programma aperto sperando che il tutto restasse inutilizzato per un bel po e quindi il GC potesse pulire il tutto...ma niente....


    Succede una cosa analoga se apro sempre lo stesso pannello....essendo pesante, prendo 10MB di ram...arrivo ad aprire circa una decina e la memoria ne risente aumentando, pero oltre un certo limite non va anche se ne apro di infiniti di questi pannelli/oggetti....Inoltre la memoria non "scende" in questi casi...

    Come potete spiegarmelo? Grazie...

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Garbage collector non funziona

    Originariamente inviato da dinoala
    ho provato a forzare la chiamata con System.gc();.
    Non forzi nulla: è solo un consiglio per la JVM, può essere tranquillamente ignorato da essa.

    L'esecuzione del garbage collector è pesante ed entra in gioco solo se necessario. Quando parte, ripulisce la memoria solo dagli oggetti che vede NON più utilizzati e non più referenziati: sicuro che i tuoi oggetti siano realmente "non utilizzati"?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    con che classe apri/carichi la foto? è uno stream? (credo di si) espone il metodo close()? (credo di si) lo chiudi subito dopo averlo usato ?(mmmm)

    Gli stream poiche al loro interno usano handler nativi (non managed) ai file, sopprimono la finalizzazione managed (che altrimenti rischierebbe di lasciare orfano un handler aperto) ed espongono il metodo close per fare in modo che vengano finalizati manualmente. Classi cosi le riconosci perche hanno un metodo close() e vanno usate sempre in un try..finally dove nel try le apri e le usi e nel finally chiami il close (eventualmente hai anche diversi catch).
    Se invece vuoi creare classi che al loro interno usano stream & co. devi incapsulare questo comportamento nella tua classe: Inizializzi lo stream (non accessibile dall'esterno quindi private) nel costruttore ed esponi all'esterno un metodo close(). Puoi avere diversi livelli di astrazione l'importante è che a monte usi questa classe esattamente come descritto poco piu su in modo da far partire la catena dei close ed arrivare fino alla chiusura dell'handler nativo.

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.