11/02/07 11:42
netarrow
Il limite è il limite del range degli interi, quindi:
int prova[] = new int[2147483647]; è il massimo
compilando questo:
public class test {
public static void main(String[] args) {
test b = new test();
b.a();
}
public void a() {
int prova[] = new int[2147483647];
}
}
nessun errore a compile time, ma se usi 2147483648 (aumentando solo di uno) da:
test.java:12: integer number too large: 2147483648
int prova[] = new int[2147483648];
^
Poi quando esegui la memoria virtuale della JVM è quella che è, infatti nel momento in cui l'esecuzione arriva nel punti in cui bisogna allocare quel vettore da:
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
In linguaggi come C++ i vettori sono limitati solo quando li allochi dentro una funzione (quindi non globali) e per valore (senza new) perchè vengono messi nello stack che molto probabilmente non ha lo spazio necessario, se si allocano globalmente o utilizzando new vengono messi nello heap che, se non sbaglio, ha tutta la ram a disposizione.
Tenendo conto però che Java non ha ne variabili globali ne allocazione per valore dei vettori tutto va nello heap, ma essendo nterpretato, è facile che la JVM non usi il vero heap del sistema ma una sua virtualizzazione limitata, infatti c'è un argomento da passare al comando java che imposta le sue dimensioni.
Cmq cercando su internet avevo trovato chi aveva problemi con 65536 elementi, vettori e cose simili, ma forse era una situazione diversa o erano vecchie versioni di java, io ho provato con 1.5.09.
Cmq come ripesco la pagina la posto che è interessante ;-)
Ultima modifica effettuata da netarrow 11/02/07 11:52
aaa