2009-12-10 9 views
8

Użyłem Out Of Memory help from sun's site. Gdzie jest cytowany jakoJak zasymulować brak pamięci: Żądany rozmiar tablicy przekroczył limit 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.

próbowałem symulować to przez

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

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

na moim komputerze z

javac *.java;java -Xmx256m JavaTest 

ale powyżej linii produkuje

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

Co czy ja tęsknię?

Aktualizacja: Moja wersja Java jest

 
$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) 

Odpowiedz

18

Dla mnie

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

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

 

PS: jeśli trzeba produkować wyjątek dla celów testowania, można też po prostu throw new OutOfMemoryError("Requested array size exceeds VM limit") samemu.

+1

Dzięki. To też działa dla mnie. Ale dlaczego mój kod nie działał wcześniej? – DKSRathore

+0

Ok.Tak więc mój system generuje ten wyjątek w zakresie od 1024 * 1024 * 1024-2 do Integer.MAX_VALUE – DKSRathore

+1

@Adrian, Skąd mam znać mój limit VM? – DKSRathore

0

Spróbuj alokacji, powiedzmy, ArrayList i podwojenie wielkości run-time.

+1

To znowu daje mi jak Wyjątek w wątku "main" java.lang.OutOfMemoryError: Java sterty przestrzeń \t na java.util.Arrays.copyOf (Arrays.java:2760) \t na java.util.Arrays.copyOf (Arrays.java:2734) \t w java.util.ArrayList.ensureCapacity (ArrayList.java:167) \t w java.util.ArrayList.add (ArrayList.java:351) \t w JavaTest.main (JavaTest. java: 27) – DKSRathore

1

Tablica jest przydzielana jako ciągła przestrzeń sterty, a pamięć może zostać pofragmentowana z powodu przydzielania obiektów i usuwania pamięci. Wystąpił błąd braku pamięci spowodowany brakiem stałego bloku pamięci do przydzielenia tablicy. Czy wysłałeś jawnie pamięć maszyny JVM z flagą -Xmx?

+0

Tak, zrobiłem. javac * .java; java -Xmx1000m JavaTest – DKSRathore

0

Wystarczy spojrzeć na przykład, że ludzie mają problem, który wydaje się występować, gdy ludzie używają natywnego interfejsu java, pomost między aplikacjami C++.

Podczas pracy z czystą aplikacją java standardowa procedura wydaje się, że przy przydzielaniu tablicy należy obliczyć bajty potrzebne od zmiennej wielkości przekazanej w czasie zwalniania tablicy, wyrzucając wyjątek java.lang.OutOfMemoryError: Java heap space.

Kiedy tablica jest tworzona poza maszyną JVM, wygląda na to, że generuje ten inny wyjątek. Jestem pewien, że istnieją pewne techniczne powody tego odmiennego zachowania.

Możesz spróbować replikować problem opisany przez tę osobę na temat tego other forum.

+0

Dziękuję za odpowiedź. Ale link do forum też nie mówi, dlaczego tak się dzieje? Czy błąd limitu VM bardziej dotyczy pamięci rodzimej niż pamięci VM? – DKSRathore

Powiązane problemy