2.5 GB の txt ファイルをアプリケーションに読み込もうとしています。私は Win7 x64 を実行しており、43GB のメモリを使用できます (64GB のうち)。-Xmx -XX:MaxParmSize -XX:ParmSize などで遊んでみました。これらのどれもエラーに影響しません。他に何を試すことができますか?確かに十分なヒープ領域が利用可能であるため、このエラーは非常に奇妙に思えます。
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)
私は走っています
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)
よろしくお願いします。
============== 答え ==============
OK、私はそれをテストしました
StringBuilder sb = new StringBuilder();
for ( int i=1; i<Integer.MAX_VALUE; i++ )
sb.append("x");
そして得た
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Unknown Source)
...
したがって、Integer.MAX_VALUE よりも大きな配列を構築しようとするのは、実際には StringBuilder です。
興味がある場合
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
}
StringBuilder を使用すると、1,207,959,550 文字を蓄積できます。これは、Integer.MAX_VALUE よりもはるかに少ない値です。