Is there a limit to the number of elements a Java array can contain? If so, what is it?
Using
OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)
... on MacOS, the answer seems to be Integer.MAX_VALUE - 2
. Once you go beyond that:
cat > Foo.java << "END"
public class Foo {
public static void main(String[] args) {
boolean[] array = new boolean[Integer.MAX_VALUE - 1]; // too big
}
}
END
java -Xmx4g Foo.java
... you get:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
MAX_VALUE-2
elements. This is independent of what I allocate, and I really wonder what can the VM use the two "things" for (the length doesn't fit in 2 bytes). –
Womble Integer.MAX_VALUE+1
, you will have an integer overflow. Array sizes in Java are int
, not long
; no matter what data type you store in your array, bytes or references. Strings are just Object references. –
Ergonomics Integer.MAX_VALUE - 2
= 2 147 483 645. Java successfully allocates such an array if you run it with -Xmx13G
. It fails with OutOfMemoryError: Java heap space
if you pass -Xmx12G
. –
Lim OutOfMemoryError
–
Zachery int
. The required heap size depends on the JVM and chosen GC. Additionally, boolean
is four times smaller than int
, and it may be compressed to store 8 values in one byte. –
Lim This is (of course) totally VM-dependent.
Browsing through the source code of OpenJDK 7 and 8 java.util.ArrayList
, .Hashtable
, .AbstractCollection
, .PriorityQueue
, and .Vector
, you can see this claim being repeated:
/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
which is added by Martin Buchholz (Google) on 2010-05-09; reviewed by Chris Hegarty (Oracle).
So, probably we can say that the maximum "safe" number would be 2 147 483 639 (Integer.MAX_VALUE - 8
) and "attempts to allocate larger arrays may result in OutOfMemoryError".
(Yes, Buchholz's standalone claim does not include backing evidence, so this is a calculated appeal to authority. Even within OpenJDK itself, we can see code like return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
which shows that MAX_ARRAY_SIZE
does not yet have a real use.)
-8
? –
Meditate -8
is due to the bytes the reserved header words would occupy. –
Obstacle There are actually two limits. One, the maximum element indexable for the array and, two, the amount of memory available to your application. Depending on the amount of memory available and the amount used by other data structures, you may hit the memory limit before you reach the maximum addressable array element.
Going by this article http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:
Java has been criticized for not supporting arrays of more than 231−1 (about 2.1 billion) elements. This is a limitation of the language; the Java Language Specification, Section 10.4, states that:
Arrays must be indexed by int values... An attempt to access an array component with a long index value results in a compile-time error.
Supporting large arrays would also require changes to the JVM. This limitation manifests itself in areas such as collections being limited to 2 billion elements and the inability to memory map files larger than 2 GiB. Java also lacks true multidimensional arrays (contiguously allocated single blocks of memory accessed by a single indirection), which limits performance for scientific and technical computing.
Arrays are non-negative integer indexed , so maximum array size you can access would be Integer.MAX_VALUE
. The other thing is how big array you can create. It depends on the maximum memory available to your JVM and the content type of the array. Each array element has it's size, example. byte
= 1 byte, int
= 4 bytes, Object
reference = 4 bytes (on a 32 bit system).
So if you have 1 MB of memory available on your machine, you could allocate an array of byte[1024 * 1024]
or Object[256 * 1024]
.
Answering your question - You can allocate an array of size (maximum available memory / size of array item).
Summary - Theoretically the maximum size of an array will be Integer.MAX_VALUE
. Practically it depends on how much memory your JVM has and how much of that has already been allocated to other objects.
I tried to create a byte array like this
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
With this run configuration:
-Xms4G -Xmx4G
And java version:
Openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)
It only works for x >= 2 which means the maximum size of an array is Integer.MAX_VALUE-2
Values above that give
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit at Main.main(Main.java:6)
Maximum number of elements of an array
is (2^31)−1
or 2 147 483 647
Integer.MAX_VALUE - 1
, you'll get "java.lang.OutOfMemoryError: Requested array size exceeds VM limit". The maximum number of elements in JDK 6 and above is Integer.MAX_VALUE - 2
= 2 147 483 645. –
Lim Yes, there limit on java array. Java uses an integer as an index to the array and the maximum integer store by JVM is 2^32. so you can store 2,147,483,647 elements in the array.
In case you need more than max-length you can use two different arrays but the recommended method is store data into a file. because storing data in the file has no limit. because files stored in your storage drivers but array are stored in JVM. JVM provides limited space for program execution.
Integer.MAX_VALUE
even if you have memory available. –
Lim Actually it's java limitation caping it at 2^30-4 being 1073741820. Not 2^31-1. Dunno why but i tested it manually on jdk. 2^30-3 still throwing vm except
Edit: fixed -1 to -4, checked on windows jvm
Java array has a limit because its a integer array, what meant it has up to 2,147,483,647 elements in array
© 2022 - 2024 — McMap. All rights reserved.