Read the above article about Java Memory management, which clearly states
I think this applies to ArrayList as it is the Resizable array implemenation.
Anatomy of a Java array object
The shape and structure of an array object, such as an array of int
values, is similar to that of a standard Java object. The primary
difference is that the array object has an additional piece of
metadata that denotes the array's size. An array object's metadata,
then, consists of: Class : A pointer to the class information, which
describes the object type. In the case of an array of int fields, this
is a pointer to the int[] class.
Flags : A collection of flags that describe the state of the object,
including the hash code for the object if it has one, and the shape of
the object (that is, whether or not the object is an array).
Lock : The synchronization information for the object — that is,
whether the object is currently synchronized.
Size : The size of the array.
max size
2^31 = 2,147,483,648
as the Array it self needs 8 bytes
to stores the size
2,147,483,648
so
2^31 -8 (for storing size ),
so maximum array size is defined as Integer.MAX_VALUE - 8
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…