PDA

View Full Version : [java] Dimensioni massime Vector - ArrayList


gaglioppo
09-05-2006, 08:25
ciao amici

ho realizzato un'applicazione che utilizza un Vector per memorizzare degli EditorPane ma mi sono accorto, ad un certo punto, che non mi basta la memoria, quindi dovrei cambiare struttura.
Conosco List con ArrayList introdotto con java 5, ma in qeusto caso nn so se avrò gli stessi problemi (e a dire il vero non so se posso restringere il campo alla sola java 5...)
ArrayList ha una dimensione massima oltre cui non si può andare?
In alternativa cosa potrei usare?

Scusate per la domanda un pò troppo sempliciotta, ma su google nn ho trovato chiari riscontri.

a presto

Angus
09-05-2006, 10:51
ciao amici

ho realizzato un'applicazione che utilizza un Vector per memorizzare degli EditorPane ma mi sono accorto, ad un certo punto, che non mi basta la memoria, quindi dovrei cambiare struttura.
Conosco List con ArrayList introdotto con java 5, ma in qeusto caso nn so se avrò gli stessi problemi (e a dire il vero non so se posso restringere il campo alla sola java 5...)
ArrayList ha una dimensione massima oltre cui non si può andare?
In alternativa cosa potrei usare?

Scusate per la domanda un pò troppo sempliciotta, ma su google nn ho trovato chiari riscontri.

a presto

ArrayList è anche nella 1.4.2 (http://java.sun.com/j2se/1.4.2/docs/api/)

Direi che,teoricamente, puoi riempire una collection che accede ai suoi elementi con un indice di tipo int fino a Integer.MAX_VALUE (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html#MAX_VALUE)

pinok
09-05-2006, 13:29
Prova a lanciare l'applicazione "allargando" la memoria disponibile invocando l'applicazione con qualcosa del tipo

java -Xms256m -Xmx400m tuoPackage.tuaApplicazione

gaglioppo
09-05-2006, 20:41
usando vector, mi pare che mi sia fermato a 4096 elementi, ma potrei sbagliarmi.
per il fatto dell'arraylist mi riferivo al fatto che usando:

List<Oggetto> lista= new ArrayList<Oggetto>();

mi richiede la 1.5

Ma se "allargo" lo spazio poi su un altro computer cosa succede?

grazie

pisto
09-05-2006, 21:54
dipende se la classe usa un array e non delle catene di oggetti: se usa un array allora la massima dimensione è Integer.MAX_VALUE, se usa una catena di oggetti (o dfelle catene di oggetti attaccate ad un array, come la HashMap) la dimensione massima non si sà, sipende da quanta memoria della VM c'è.

PGI-Bis
09-05-2006, 22:40
Nel linguaggio di programmazione Java la dimensione massima di un ArrayList è il valore positivo massimo di un int.

Sulla piattaforma c'è il limite delle dimensioni dell'heap, che espandi con l'opzione di cui è già stato detto. Naturalmente devi includere tra i parametri d'avvio della jvm l'espansione per tutti coloro che eseguiranno l'applicazione altrimenti incorrerai nell'esaurimento della memoria disponibile. Come dipende dalla forma con cui distribuisci l'applicazione. Java Web Start ha il suo metodo (un parametro ad hoc nel descrittore jnlp), per le applicazione stand-alone puoi usare uno script di avvio, per le applet...o il client interviene a manina sulla configurazione o ciccia.

C'è poi anche una curiosità di cui non sono riuscito a trovare documentazione. Apparentemente la JVM incorpora un limite ulteriore alla semplice dimensione della memoria disponibile. Sul mio PC se provo a far creare alla JVM un array (ArrayList usa un array) di lunghezza Integer.MAX_VALUE la jvm non dice "OutOfMemoryError: heap space" ma "OutOfMemoryError: requested array size exceeds VM limits". Non avendo trovato riferimenti al riguaro ho fatto un paio di prove e sembra che la JVM rilasci due specie di "OutOfMemory" diversi a seconda che si superi o no una certa soglia. Uno è il limite dell'heap, che controlli con l'opzione -Xmx, l'altro è questo fantomatico "VM limit", insensibile all'Xmx. Mistero?

Angus
09-05-2006, 22:40
usando vector, mi pare che mi sia fermato a 4096 elementi, ma potrei sbagliarmi.
per il fatto dell'arraylist mi riferivo al fatto che usando:

List<Oggetto> lista= new ArrayList<Oggetto>();

mi richiede la 1.5

Ma se "allargo" lo spazio poi su un altro computer cosa succede?

grazie

Ti chiede la 1.5 perchè stai usandone la sintassi (Generics).
Prova a scrivere:

List lista = new ArrayList();

^TiGeRShArK^
10-05-2006, 01:10
Nel linguaggio di programmazione Java la dimensione massima di un ArrayList è il valore positivo massimo di un int.

Sulla piattaforma c'è il limite delle dimensioni dell'heap, che espandi con l'opzione di cui è già stato detto. Naturalmente devi includere tra i parametri d'avvio della jvm l'espansione per tutti coloro che eseguiranno l'applicazione altrimenti incorrerai nell'esaurimento della memoria disponibile. Come dipende dalla forma con cui distribuisci l'applicazione. Java Web Start ha il suo metodo (un parametro ad hoc nel descrittore jnlp), per le applicazione stand-alone puoi usare uno script di avvio, per le applet...o il client interviene a manina sulla configurazione o ciccia.

C'è poi anche una curiosità di cui non sono riuscito a trovare documentazione. Apparentemente la JVM incorpora un limite ulteriore alla semplice dimensione della memoria disponibile. Sul mio PC se provo a far creare alla JVM un array (ArrayList usa un array) di lunghezza Integer.MAX_VALUE la jvm non dice "OutOfMemoryError: heap space" ma "OutOfMemoryError: requested array size exceeds VM limits". Non avendo trovato riferimenti al riguaro ho fatto un paio di prove e sembra che la JVM rilasci due specie di "OutOfMemory" diversi a seconda che si superi o no una certa soglia. Uno è il limite dell'heap, che controlli con l'opzione -Xmx, l'altro è questo fantomatico "VM limit", insensibile all'Xmx. Mistero?
penso ke la soluzione sia qua ;)
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.0.Out-of-Memory%20Exceptions%7Coutline
non ho avuto il tempo di leggere tutto, ma a quanto ho capito è un problema del garbage collector che non riesce a deallocare correttamente la memoria...

Angus
10-05-2006, 01:34
Nel linguaggio di programmazione Java la dimensione massima di un ArrayList è il valore positivo massimo di un int.

Sulla piattaforma c'è il limite delle dimensioni dell'heap, che espandi con l'opzione di cui è già stato detto. Naturalmente devi includere tra i parametri d'avvio della jvm l'espansione per tutti coloro che eseguiranno l'applicazione altrimenti incorrerai nell'esaurimento della memoria disponibile. Come dipende dalla forma con cui distribuisci l'applicazione. Java Web Start ha il suo metodo (un parametro ad hoc nel descrittore jnlp), per le applicazione stand-alone puoi usare uno script di avvio, per le applet...o il client interviene a manina sulla configurazione o ciccia.

C'è poi anche una curiosità di cui non sono riuscito a trovare documentazione. Apparentemente la JVM incorpora un limite ulteriore alla semplice dimensione della memoria disponibile. Sul mio PC se provo a far creare alla JVM un array (ArrayList usa un array) di lunghezza Integer.MAX_VALUE la jvm non dice "OutOfMemoryError: heap space" ma "OutOfMemoryError: requested array size exceeds VM limits". Non avendo trovato riferimenti al riguaro ho fatto un paio di prove e sembra che la JVM rilasci due specie di "OutOfMemory" diversi a seconda che si superi o no una certa soglia. Uno è il limite dell'heap, che controlli con l'opzione -Xmx, l'altro è questo fantomatico "VM limit", insensibile all'Xmx. Mistero?

Puzza di baco nella JVM 1.5 (qualcosa simile a questo (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5089202)) Se provi a far girare lo stesso codice con la JVM di Mustang ottieni il più familiare "OutOfMemoryError: heap space".

Comunque bisogna fare attenzione: quanta memoria occupa un riferimento? Supponendo che occupi 32 bit, con un'istruzione del tipo:

Object[] array = new Object[Integer.MAX_VALUE]

si richiederebbe alla JVM di allocare uno spazio di memoria di almeno Integer.MAX_VALUE * 32 bit.

PGI-Bis
10-05-2006, 09:24
Verissimo, Angus hai ragione: baco del tigrotto.