我有一个带有8GB RAM的2010 iMac,使用Java1.8.0_25运行EclipseNeon.2发行版(4.6.2)。使用VM参数-Xmx6g,我运行了以下代码:StringBuilder sb = new StringBuilder();for (int i = 0; i
try {
sb.append('a');
} catch (Throwable e) {
System.out.println(i);
break;
}}System.out.println(sb.toString().length());
这些指纹:Requested array size exceeds VM limit1207959550
因此,最大阵列大小似乎是1,207,959,549。然后,我意识到我们实际上并不关心Java是否耗尽内存:我们只是在寻找最大数组大小(这似乎是某个地方定义的常量)。因此:for (int i = 0; i
try {
char[] array = new char[Integer.MAX_VALUE - i];
Arrays.fill(array, 'a');
String string = new String(array);
System.out.println(string.length());
} catch (Throwable e) {
System.out.println(e.getMessage());
System.out.println("Last: " + (Integer.MAX_VALUE - i));
System.out.println("Last: " + i);
}}
其中的指纹:Requested array size exceeds VM limitLast: 2147483647Last: 0Requested array size exceeds VM limitLast: 2147483646Last:
1Java heap spaceLast: 2147483645Last: 2
因此,最大值似乎是Integer.max_value-2或(2^31)-3
我不知道为什么我的StringBuilder在.1207959550而我char[]最高值为(2^31)-3。看来AbstractStringBuilder是内部的两倍大char[]来生长它,所以这很可能导致了这个问题。