A DESCRIPTION OF THE PROBLEM :
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
The maximum size of an array the VM lets create is Integer.MAX_VALUE - 2. (2147483645)
The MAX_ARRAY_SIZE constant's value is Integer.MAX_VALUE - 8. (2147483639)
So any value between the two will result in hugeCapacity function to return Integer.MAX_VALUE.
Which value is too high so it will cause an OutOfMemoryError.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
byte[] buf = new byte[Integer.MAX_VALUE-6];
ByteArrayOutputStream out = new ByteArrayOutputStream(1);
out.write(buf);
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The underlaying array in the ByteArrayOutputStream can be the same size as buff variable.
ACTUAL -
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.OutputStream.write(OutputStream.java:75)
at com.company.Main.main(Main.java:17)
---------- BEGIN SOURCE ----------
package com.company;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[Integer.MAX_VALUE-6];
ByteArrayOutputStream out = new ByteArrayOutputStream(1);
out.write(buf);
}
}
---------- END SOURCE ----------
FREQUENCY : always
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
The maximum size of an array the VM lets create is Integer.MAX_VALUE - 2. (2147483645)
The MAX_ARRAY_SIZE constant's value is Integer.MAX_VALUE - 8. (2147483639)
So any value between the two will result in hugeCapacity function to return Integer.MAX_VALUE.
Which value is too high so it will cause an OutOfMemoryError.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
byte[] buf = new byte[Integer.MAX_VALUE-6];
ByteArrayOutputStream out = new ByteArrayOutputStream(1);
out.write(buf);
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The underlaying array in the ByteArrayOutputStream can be the same size as buff variable.
ACTUAL -
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.OutputStream.write(OutputStream.java:75)
at com.company.Main.main(Main.java:17)
---------- BEGIN SOURCE ----------
package com.company;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[Integer.MAX_VALUE-6];
ByteArrayOutputStream out = new ByteArrayOutputStream(1);
out.write(buf);
}
}
---------- END SOURCE ----------
FREQUENCY : always
- relates to
-
JDK-8055949 ByteArrayOutputStream capacity should be maximal array size permitted by VM
-
- Closed
-
- links to