2009-12-10 14 views
8

Ho utilizzato lo Out Of Memory help from sun's site. Dove viene citato comeCome simulare la memoria esaurita: la dimensione dell'array richiesto supera il limite della VM

Out Of Memory : Requested array size exceeds VM limit

This indicates that the application attempted to allocate an array that is larger than the heap size. For example, if an application tries to allocate an array of 512MB but the maximum heap size is 256MB, then this error will be thrown. In most cases the problem is likely to be either that the heap size is too small or that a bug results in the application attempting to create an array whose size is calculated to be incorrectly huge.

ho cercato di simulare questo

import java.util.ArrayList; 
import java.util.List; 

public class JavaTest { 
    public static void main(String[] args){ 
     long[] ll = new long[64*1024*1024]; 
    } 
} 

sulla mia macchina con

javac *.java;java -Xmx256m JavaTest 

Ma la linea di cui sopra sta producendo

 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at JavaTest.main(JavaTest.java:7) 

Cosa mi sto perdendo?

Aggiornamento: La mia versione java è

 
$java -version 
java version "1.6.0_15" 
Java(TM) SE Runtime Environment (build 1.6.0_15-b03) 
Java HotSpot(TM) Server VM (build 14.1-b02, mixed mode) 

risposta

18

Per me

long[] l = new long[Integer.MAX_VALUE]; 

cede Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

 

PS: se è necessario produrre l'eccezione a scopo di test, si potrebbe anche solo throw new OutOfMemoryError("Requested array size exceeds VM limit") te stesso.

+1

Grazie. Funziona anche per me. Ma perché il mio codice non ha funzionato prima? – DKSRathore

+0

Ok.Quindi il mio sistema produce questa eccezione nell'intervallo 1024 * 1024 * 1024-2 a Integer.MAX_VALUE – DKSRathore

+1

@Adrian, Come faccio a sapere il limite della mia VM? – DKSRathore

0

Prova assegnazione, per esempio, un ArrayList e di raddoppiare la sua dimensione di run-time.

+1

Anche questo mi dà come Exception in thread java.lang.OutOfMemoryError "principale": lo spazio di heap Java \t a java.util.Arrays.copyOf (Arrays.java:2760) \t a java.util.Arrays.copyOf (Arrays.java:2734) \t a java.util.ArrayList.ensureCapacity (ArrayList.java:167) \t a java.util.ArrayList.add (ArrayList.java:351) \t a JavaTest.main (javatest. java: 27) – DKSRathore

1

L'array viene assegnato come spazio heap continuo e la memoria può essere frammentata a causa dell'allocaion dell'oggetto e della garbage collection. L'errore di memoria insufficiente si verifica a causa della mancanza di un solido blocco di memoria per allocare l'array. Hai inviato esplicitamente la memoria JVM con il flag -Xmx?

+0

Sì, l'ho fatto. javac * .java; java -Xmx1000m JavaTest – DKSRathore

0

Basta guardare l'esempio per le persone che hanno il problema che sembra verificarsi quando le persone utilizzano l'interfaccia java nativa, ponte tra le applicazioni C++.

Quando si esegue l'applicazione java pura, la procedura standard sembra per l'allocazione di un array è calcolare i byte necessari dalla variabile dimensione passata nella decelerazione dell'array generando un'eccezione java.lang.OutOfMemoryError: Java heap space.

Quando la matrice viene creata all'esterno della JVM, sembra che questa sia un'altra eccezione. Sono sicuro che ci sono alcune ragioni tecniche per questo diverso comportamento.

Si potrebbe provare a replicare il problema che questa persona descrive su questo other forum.

+0

Grazie per la risposta. Ma il link del forum non sta dicendo perché questo sta accadendo? L'errore del limite VM è più preoccupante per la memoria nativa della memoria VM? – DKSRathore

Problemi correlati