Próbuję odczytać plik txt 2,5 GB do mojej aplikacji. Używam Win7 x64 i mam dostępne 43 GB pamięci (z 64 GB). Próbowałem odtwarzać z opcją -Xmx -XX: MaxParmSize -XX: ParmSize itp. Żadne z tych nie wpływa na błąd. Co jeszcze mogę spróbować? Ten błąd wydaje się bardzo dziwny, ponieważ na pewno mam wystarczająco dużo miejsca na sterty.java.lang.OutOfMemoryError pomimo dużej ilości
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at j.utilities.IO.loadString(IO.java:187)
at j.utilities.IO.loadString(IO.java:169)
at city.PreProcess.main(PreProcess.java:78)
Używam
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
Bardzo dziękuję z góry.
============== ODPOWIEDŹ ==============
OK, ja tylko testowałem to z
StringBuilder sb = new StringBuilder();
for (int i=1; i<Integer.MAX_VALUE; i++)
sb.append("x");
i dostał
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
...
ten sposób, to naprawdę jest StringBuilder który próbuje zbudować tablicę większy niż Integer.MAX_VALUE.
W przypadku zainteresowanych
StringBuilder sb = new StringBuilder();
int i=1;
try {
for (; i<Integer.MAX_VALUE; i++)
sb.append("x");
} catch (OutOfMemoryError e) {
System.out.println(i); // OUTPUT: 1207959551
System.out.println(Integer.MAX_VALUE); // OUTPUT: 2147483647
}
Z StringBuilder można gromadzić 1,207,959,550 znaki - znacznie mniej niż Integer.MAX_VALUE.
Wygląda na to, że próbujesz przydzielić tablicę. Ile elementów ma tablica? – reprogrammer
Co to jest kod w 'PreProcess.java: 78'? –
Co to jest "j.utilities.IO"? Jeśli to twój kod wklej "IO.java: 169". –