Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Interrompere un thread

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    Ho fatto partire due thread con le modifiche suggerite.
    Ora noto che l'esecuzione si interrompe a volte dopo 7 iterazioni, altre volte dopo 13 ritornandomi questo errore:

    Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at main.Istanza.getShortestPathTo(Istanza.java:653)
    at main.Istanza.calcoloCamminoMin(Istanza.java:431)
    at main.Veicolo.esecuzioneGreedy(Veicolo.java:130)
    at main.Veicolo.run(Veicolo.java:116)
    Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at main.Istanza.getShortestPathTo(Istanza.java:653)
    at main.Istanza.calcoloCamminiMinRic(Istanza.java:484)
    at main.Istanza.raggiungoRicarica(Istanza.java:662)
    at main.Veicolo.esecuzioneGreedy(Veicolo.java:174)
    at main.Veicolo.run(Veicolo.java:116)

    Mi sapreste dire come mai questo comportamento avviene ad un numero diverso di iterazioni?
    Vi ringrazio moltissimo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kiaBs Visualizza il messaggio
    Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
    A fronte di un OutOfMemoryError, si possono pensare due cose:
    a) il tuo codice ha davvero bisogno di molta memoria, per motivi ben precisi e che ovviamente devi ben conoscere e prevedere tu. In tal caso è sufficiente avviare la JVM sempre specificando un appropriato heap-space iniziale/massimo.
    b) il tuo codice è scritto male e/o fa un "cattivo" uso degli oggetti. Motivo per cui, anche con heap-space "ragionevoli", fallisce abbastanza velocemente. In tal caso non ti aspettavi appunto un tale uso eccessivo.

    Quale è dei due? Che cosa fa il tuo codice?
    Ultima modifica di andbin; 25-06-2014 a 16:54
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    E' molto probabile che sia perché ha bisogno di tanta memoria.
    Sto risolvendo un problema di Arc Routing, e i miei thread devono spostarsi di nodi in nodi calcolando cammini minimi verso varie destinazioni. Facendo una serie di stampe di prove, effettivamente il programma si "incanta" nel calcolare i cammini minimi verso vari nodi. In quella porzione di codice non ci sono riferimenti a oggetti: applico un algoritmo di calcolo di distanze.

    for (Nodo nodo:this.getNodi())
    {
    //System.out.println("qui");
    Cammino c = new Cammino(nodo,nodo.minDistance,this.getShortestPathTo(nodo));
    listaTotale.aggCammino(c);
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kiaBs Visualizza il messaggio
    E' molto probabile che sia perché ha bisogno di tanta memoria.
    Sto risolvendo un problema di Arc Routing, e i miei thread devono spostarsi di nodi in nodi calcolando cammini minimi verso varie destinazioni. Facendo una serie di stampe di prove, effettivamente il programma si "incanta" nel calcolare i cammini minimi verso vari nodi. In quella porzione di codice non ci sono riferimenti a oggetti: applico un algoritmo di calcolo di distanze.
    Questo codice che hai postato non "dice" più di tanto (almeno a me). Dovresti indagare tu, magari facendo del debugging o anche solo loggando certe informazioni.

    Il problema tecnico è chiaro dallo stack trace:

    codice:
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at main.Istanza.getShortestPathTo(Istanza.java:653)

    Il tuo getShortestPathTo aggiunge un elemento ad un ArrayList. L'aggiunta è tale per cui l'ArrayList deve espandere il suo array interno. Ma nella istanziazione operata da copyOf fallisce.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

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 © 2026 vBulletin Solutions, Inc. All rights reserved.