我正在尝试将 2.5GB 的 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)
提前非常感谢。
============== 答案===============
好的,我刚刚测试过
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)
...
因此,实际上是 StringBuilder 试图构建一个大于 Integer.MAX_VALUE 的数组。
如有兴趣
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。