|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
[Java] Esaurire lo Heap Space
Salve a tutti,
sto sviluppando un simulatore in Java che deve tener conto del comportamento di un elevato numero di oggetti. Con simulazioni di test, nessun problema, ma quando comincio a fare simulazioni realistiche (ho provato al momento con qualche migliaio di oggetti), esaurisco lo Heap in pochissimo tempo, incappando nell'errore: java.lang.OutOfMemoryError: Java heap space Come potrei risolvere il problema? Dal task manager vedo che la simulazione non eccede mai i 290MB circa di RAM... Ho provato a modificare il file eclipse.ini ma non è cambiato nulla, con valori bassi di Xmx256m o Xmx384m, mentre per valori molto superiori non avvia Eclipse... Esistono altri metodi per poter gestire decine di migliaia di oggetti o per aumentare lo Heap?
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Comunque non sono i parametri per lo heap space di Eclipse che devi impostare ma i parametri dello heap space da allocare all jvm per la tua applicazione: quindi non credo tu debba toccare tanto eclipse.ini quanto i parametri da riga di comando da passare a java, quando viene lanciata la tua applicazione.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Non avevo capito che era per i - valori molto alti -, pensavo fosse per i 300 e rotti MB
Probabilmente hai usato valori che, al momento dell'avvio di Eclipse, eccedevano la RAM disponibile sulla macchina...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Eppure ho 4GB di ram, al lancio di Eclipse ne era occupata circa il 40%...
Avevo impostato 1400, in teoria dovevano essere diponibili... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Ho effettuato anche un'altra prova e ho constatato che la memoria non viene liberata neanche invocando il garbage collector.
Spendo due parole per descrivere a grandi linee il Simulatore. Una classe (il main) gestisce il motore dell'applicazione invocando ad ogni istante temporale un certo numero di operazioni sugli oggetti viventi. Ogni oggetto vivente viene inserito, alla sua creazione, in una lista della classe main (ad esempio: listaDegliOggettiViventi). Alla fine di ogni step temporale, il simulatore invoca il Garbage Collector con il comando System.gc(); Al termine di un istante temporale scelto arbitrariamente (ad es: il 100°) ho "distrutto" il 90% degli oggetti esistenti, tagliando i loro riferimenti presso il metodo main (ho svuotato la lista...). Dal Task Manager di Windows non si rilevano rilasci di memoria. Rimane sempre occupata al massimo raggiunto da quella esecuzione. In teoria, avendo tagliato i riferimenti agli oggetti, questi non dovrebbero venire distrutti immediatamente? (Invoco io il GC e non attendo i tempi della JVM) |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sono un ignorantone: non so dire se alla fine di una "corsa" del GC la memoria che viene "liberata" (o meglio resa disponibile) viene a sua volta rilasciata al SO dalla JVM o la JVM, già che ce l'ha sottomano, se la tiene per se (la memoria è comunque libera e a disposizione: bisognerebbe conoscere le politiche di deallocazione della JVM) e quindi tu nel task Manager non vedi apprezzabili deallocazioni.
Comunque a scanso di eqivoci ricorda che System.gc() non invoca il Garbage Collector, ma "suggerisce" solo alla JVM di lanciarlo, con tutti i "per piacere, appena puoi, eh" del caso. @EDIT: per monitorare le cose potresti provare jconsolle (è uno dei "basic tool" distribuiti con il JDK).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 03-08-2010 alle 16:21. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Eh, sono ignorante anch'io in materia
Tanto non era quello il problema originale, volevo solo verificare che la distruzione andasse a buon fine, sperando di evitare il riempimento delle Heap. Ora vedo cosa esce fuori con jconsolle... |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
E' la cosa migliore.
Ma avevi letto questo passaggio, vero? Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Si, l'avevo letto, ma non riesco a passarglieli. Ti spiego cosa ho fatto:
- Da console dei comandi sono entrato nella cartella contenente la classe "main". - Ho provato a lanciare java -Xms... Xmx.... Test.class Però mi restituisce un errore, non riesce a trovare la main class: "java.lang.NoClassDefFoundError: [...] Could not dind the main class: Test. Program will exit." P.S. La mia classe main si chiama Test.class... |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Comunque Eclipse, in quanto IDE, di sicuro ti permette di personalizzare i parametri per il run (run configuration) da dentro l'ide... io non son pratico, sono dell'altra sponda.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Ecco perché odio Java e annessi (ogni tanto me lo ricordo) |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
[OT]
Quote:
E poi bisogna anche essere consci del perchè le cose funzionano come funzionano, prima di decidere, ma sui gusti non si discute @EDIT: [IT] Chiaramente Tommo ha ragione. Anche quello va sistemato.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 03-08-2010 alle 17:22. Motivo: Syntax horror |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
E' uno dei tanti :P E poi giustamente i gusti sono gusti |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Scusa se insisto, hai letto questo?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Quote:
Avevo letto solo i post degli altri 2 utenti ed il tuo mi si è confuso con quelli vecchi, non me ne ero proprio accorto! Ma che intendi con "la cartella che contiene il package radice"? Ho già fatto i seguenti tentativi: Mi sono posizionato nella cartella \bin del package, ed ho usato il comando "java c:\workspace\prova\bin\Test", questa prova l'ho fatta anche in \prova, senza entrare in \bin e anche da \src, ma chiamando Test.java. Restituisce sempre lo stesso errore. Non ho mai lanciato un programma dalla console, ho sempre usato eclipse. Ora vedo se riesco ad impostare i parametri per il run direttamente da eclipse... |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Mi spiego meglio con un esempio, mi viene più semplice. Immagina che io nel mio pc ho creato con Eclipse un progetto "JavaCourseFondamental" (Eclipse crea su disco una cartella con questo nome) nella mia cartella "eclipseProjects" che tengo nel disco fisso "C:\". Al progetto ho aggiunto un package "exercises" in cui a sua volta ho creato una classe di nome "Main", e l'ho compilata. Eclipse piazza il mio bel Main.class in una sottocartella che lui(Eclipse) chiama "bin", dentro la cartella del progetto, la famosa "JavaCourseFondamental" di prima. Ovviamente la classe Main è dotata di entry point. Per lanciarla da consolle faccio così: Codice:
cd C:\eclipseProjects\JavaCourseFundamental\bin java exercises.Main
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Quote:
Ti ringrazio per la pazienza e la spiegazione. A mio avviso, l'unica differenza tra il tuo caso ed il mio è che io non ho creato il package, cioè in Eclipse le classi appartengono al Default Package, che non ha un nome vero e proprio... Usando il tuo stesso comando non funziona (usando "default package".Main). Sto cercando in rete se ha un altro nome o se è possibile lanciare da console il comando, ma non ho trovato ancora nulla |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:24.




















