Visualizzazione dei risultati da 1 a 9 su 9

Discussione: OutOfMemoryError

  1. #1

    OutOfMemoryError

    Ciao a tutti!

    Sto facendo girare il mio programma Java con NetBeans.
    Il problema è che ad un certo punto mi si è generato questo errore...

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    come posso ovviare?

  2. #2
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Probabilmente stai creando troppo oggetti, no?

    Puoi aumentare la memoria della VM col parametro -Xmx400m (400 MB così) di java.exe

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: OutOfMemoryError

    Originariamente inviato da michela85cancro
    Sto facendo girare il mio programma Java con NetBeans.
    Il problema è che ad un certo punto mi si è generato questo errore...

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    come posso ovviare?
    Dipende da cosa hai fatto di preciso ... se posti qualcosa del codice si può cercare di capire.
    La dimensione massima del heap si può anche aumentare tramite una opzione non standard ma ... se il tuo codice fa dei giri "viziosi" o gestisce male gli oggetti e la memoria, comunque risulta inefficiente e problematico. Aumentare l'heap può dare un po' di "sollievo" ma se si beve troppa memoria la cosa è da capire/valutare!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    il mio programma è un'euristica per risolvere un problema NP-hard....
    C'è un modo per eliminare gli oggetti che ho creato e che ora non mi servono più? (ho imparato da poco java e da autodidatta...)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da michela85cancro
    C'è un modo per eliminare gli oggetti che ho creato e che ora non mi servono più?
    Il gc (garbage collector) elimina automaticamente gli oggetti non più "referenziati" (questo è il concetto generale ... poi se si andasse a vedere i dettagli più intricati del gc ci sarebbe altro da dire). Ma se tu tieni referenziati, anche involontariamente, degli oggetti che non usi più .... beh, come vedi il problema resta comunque.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    quindi, se ho capito bene, se ho creato alcuni oggetti all'interno di metodi (anche statici?), una volta che il metodo è stato eseguito, tali oggetti non sono più referenziati e quindi non occupano più spazio?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da michela85cancro
    quindi, se ho capito bene, se ho creato alcuni oggetti all'interno di metodi (anche statici?), una volta che il metodo è stato eseguito, tali oggetti non sono più referenziati e quindi non occupano più spazio?
    Dipende .... da dove/come sono referenziati.

    codice:
    public void metodo() {
        Integer i = new Integer(123);
    }
    'i' è una variabile locale al metodo e l'oggetto Integer è referenziato solo da 'i'. Quando il metodo termina, la variabile 'i' sparisce e questo è ovvio e non è evitabile. Se sparisce, l'oggetto non sarà più referenziato, quindi diventa "eleggibile" per il g.c.

    Se però ad esempio hai fatto:

    codice:
    public void metodo() {
        Integer i = new Integer(123);
        arrayDiIstanza[2] = i;
    }
    Dove arrayDiIstanza è un Integer[] tra le variabili di "istanza". Anche quando il metodo termina e 'i' sparisce, l'oggetto Integer è comunque tenuto referenziato dall'array di istanza e solo quando l'oggetto che ha questa variabile di istanza non sarà più referenziato, allora pure l'Integer non lo sarà più.

    Insomma, un oggetto è "referenziato" se da almeno 1 "live" thread si può tracciare un (qualunque) cammino verso l'oggetto. Se da nessun live thread si può tracciare un cammino all'oggetto, allora non è referenziato.

    Il g.c. può anche gestire le cosiddette "island of isolation", due o più oggetti che si referenziano tra di loro ma che non sono "raggiungibili" da alcun thread. In quel caso vanno comunque in pasto al g.c.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ciao,

    dai un occhio a questo mio articolo: http://java.html.it/articoli/leggi/2...i-memory-leak/
    Mostra situazioni in cui è possibile creare memory leak, ovvero oggetti in memoria non più utilizzabili ma il cui reference resta attivo

    Per il tuo problema: attenzione che il tuo algoritmo euristico potrebbe, di per sé, richiedere troppe risorse rispetto a quelle a disposizione. In quel caso non si tratta tanto di trovare memory leak ma rivedere pesantemente l'algoritmo stesso
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  9. #9
    Grazie a tutti! Ho risolto spostando alcuni pezzi in metodi static....

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.