Newsgroup: it.comp.java
Titolo: Recuperare da un OutOfMemoryError

Salve a tutti,
sto scrivendo un'applicazione in grado di effettuare il parsing dei file di
testo, per estrarre le eventuali informazioni d'interesse. I dati che
vengono estratti vengono memorizzati in una collezione (per l'esattezza un
SortedSet) di oggetti, che ho creato appositamente per gestire il tipo di
informazioni che voglio raccogliere.
Considerato la tipologia dei file vado ad analizzare (diciamo che il 95%
delle righe contiene dei dati significativi) ho dei problemi quando vado ad
esaminare file di dimensioni superiori ai 400KB, il che equivale ad avere
una collezione di poco più di 10.000 elementi. Infatti, molto probabilmente
a causa delle dimensioni della collezione, viene sollevata l'eccezione :
			OutOfMemoryError
Chiaramente catturo l'eccezione ma dopo ho dei problemi nell'esecuzione del
programma, perché ogni azione che richiede una seppur minima allocazione di
memoria solleva nuovamente l'eccezione OutOfMemoryError.
La mia domanda è questa : come faccio a recuperare memoria dopo il
sollevamento dell'eccezione OutOfMemoryError ??? È possibile farlo oppure
devo invertarmi qualcosa per una sorta di gestione della memoria virtuale in
Java (come si era detto in un precedente thread, al quale io stesso ho
partecipato, riguardo alla visualizzazione dei dati estratti da un DB in una
JTable) ????
Se avete una soluzione, o qualche consiglio, saro lieto di ascoltarlo.
Vi ringrazio, Claudio
________________________________________________
Se c'è soluzione perché ti preoccupi ??
Se non c'é soluzione perché ti preoccupi ???
________________________________________________

 Vi ringrazio, Claudio
non vorrei dire una fesseria...ma potresti invocare manualmente la garbage
collection...
-- 
ShadowMan


... OutOfMemoryError č si un Throwable ma č un Error non una
Exception.. puoi farci ben poco a quel livello, invocare il gc come ti
č stato consigliato non ti puň aiutare: tutti i 10.000 elementi sono
ancora belli che referenziati, e cmq non č affatto detto che il gc
abbia modo di lavorare in quelle condizioni.
<cite>
 You should not try to catch OutOfMemoryErrors in your application.  
 They are not generally predictable. And when they do happen, there's 
 nothing to be done to recover, because by then the JVM is out of 
 memory and the garbage collector is unable to free any memory for 
 further work. 
</cite>
non vedo altre soluzioni valide se non provare ad aumentare le
dimensioni dello heap o riscrivere il codice per fare in modo che
quegli elementi occupino meno spazio ( nell'heap ).
( 
 per aumentare la maximum size dell'heap: 
	java -Xms128m -Xmx256m blahblah
       \----------|---dimensione iniziale = 128Mb
                  \---dimensione massima  = 256Mb
)
sbirish.

collection...
Secondo me servirebbe a poco, perchè nella situazione descritta il gc
non potrebbe fare nulla, dato che il SortedSet (quale implementazionde
di esso non saprei) mantiene un riferimento vivo a tutti gli oggetti
che vengono aggiunti alla collection.
Vorrei chiedere a Claudio se può fornire qualche info in più riguardo
alla tipologia di dati trattati (sempre se non sei legato dal segreto
industriale e dal contratto di lavoro). Pensa a questo: se i dati da
trattare hanno una struttura simile tra loro (e se l'architettura
della tua applicazione lo permette) perchè non elaborarli un record
alla volta? o si tratta della stessa applicazione che deve
visualizzare *tutti* i record di una query in una JTable?
*Potrebbe* essere necessario rivedere le specifica. Se è assolutamente
indispensabile mantenere gli oggetti in una Collection per poter
accedere a qualunque di essi in ogni momento, ti conviene
re-implementare SortedSet per lavorare con un file temporaneo su disco
fisso (come già detto nell'altro post).
Ti dirò. per conto mio sto già provando a implementare quest'ultima
soluzione, ma mi mette molti dubbi il livello di prestazioni (basso).
Forse (invece di usare gli Stream del package 
java.io
) dovrei iniziare
ad usare java.nio ... o magari scrivere tutto in C e collegarlo con
JNI...
chi vivrà vedrà.
--
"tanto va la gatta al largo che affoga"
(per rispondere personalmente leva IlDitoDalCulo)

 [CUT]
Mi spieghi come fai da un file di 400K a riempire la memoria? Se anche 
ogni info che tiri fuori occupa 4 volte lo spazio che occupa nel file al 
massimo arrivi a 1600K! Neanche 2 Mega. Anche un palmare ha memoria a 
sufficienza per gestire la cosa. Boh!
Ciao.
  -Ema-

 chi vivrà vedrà.
L'argomento mi interessa molto. Se hai qualche idea, notizia, intuizione al
riguardo sarei contento se tu la postassi sul NG...non sono IL GURU della
programmazione Java, ma qualche opinione posso sempre dartela
Ti saluto, Claudio
-- 


 sufficienza per gestire la cosa. Boh!
Ti assicuro che ho parecchia RAM disponibile (1 GB), ma è chiaro che la JVM
si autolimita. Poi c'è l'allocazione degli oggetti necessari a parsare le
informazioni, quella che viene utilizzata dai vari metodi delle classi che
implementano Collection, ecc.....senza contare che ci sono altri processi
Anche a me sembra strano, che ci devo fare ???
-- 


 
Su che SO lavori? Che JVM usi? Controlla lo spazio occupata dalla JVM 
quando il programma lavora. Se usi un IDE per il debugging prova a 
lanciare l'applicazione fuori dall'ide.
Ciao.
  -Ema-

 lanciare l'applicazione fuori dall'ide.
Uso Windows 2000 Professional Service Pack 4, e la JVM e l'ultima rilasciata
dalla Sun ovvero la 1.4.2. Adesso provo a lanciare l'applicazione fuori
dall'IDE (l'eccezionale NetBeans 3.5)


 dall'IDE (l'eccezionale NetBeans 3.5)
Come e' andata a finire? Che cosa hai scoperto? Non hai ancora fatto 
oppure non ce ne vuoi rendere partecipi?
Ciao.
  -Ema-

Ho capito perché....si tratto di una sorta di baco del mio parser : anzi per
dirla tutta, il problema è che l'espressione predefinita per il
riconoscimento dei caratteri (\w) non riconosce i caratteri accentati e
quando li trova cicla all'infinito e mi ciuccia tutta la memoria !!!
Faccio mea culpa avrei dovuto informarmi con più attenzione sui caratteri
riconosciuti, ma devo ammettere che non sapevo che i caratteri accentati
fossero validi nelle URL
Grazie a tutti per la vostra collaborazione e....scusate se vi ho fatto
perdere tempo per i miei errori !!!


 
Finalmente! Ogni tanto qualcuno riporta il risultato finale. Mi stanno 
veramente antipatici quelli che vengono sul ng prendono le imbeccate e 
poi non dicono nulla sul risultato.
Ciao.
  -Ema-