una - tamaño de un array java
¿Las matrices de Java tienen un tamaño máximo? (7)
¿Hay un límite en la cantidad de elementos que puede contener una matriz de Java? Si es así, ¿qué es?
El número máximo de elementos de una array
es (2^31)−1
o 2 147 483 647
En este artículo http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays :
Java ha sido criticado por no admitir matrices de más de 2 elementos 31 -1 (alrededor de 2.1 mil millones). Esta es una limitación del lenguaje; La especificación del lenguaje Java, Sección 10.4, establece que:
Las matrices deben estar indexadas por valores int ... Un intento de acceder a un componente de matriz con un valor de índice largo da como resultado un error en tiempo de compilación.
El soporte de matrices grandes también requeriría cambios en la JVM. Esta limitación se manifiesta en áreas como las colecciones que se limitan a 2 mil millones de elementos y la incapacidad de los archivos de mapas de memoria mayores de 2 GiB. Java también carece de verdaderos arreglos multidimensionales (bloques individuales asignados de forma contigua a los que se accede mediante un solo direccionamiento indirecto), lo que limita el rendimiento de la computación científica y técnica.
En realidad hay dos límites. Uno, el elemento máximo indexable para la matriz y, dos, la cantidad de memoria disponible para su aplicación. Dependiendo de la cantidad de memoria disponible y la cantidad utilizada por otras estructuras de datos, puede alcanzar el límite de memoria antes de alcanzar el elemento de matriz direccionable máximo.
Esto es (por supuesto) totalmente dependiente de VM.
Navegando a través del código fuente de OpenJDK 7 y 8 java.util.ArrayList
, .Hashtable
, .AbstractCollection
, .PriorityQueue
y .Vector
, puede ver que se repite esta afirmación :
/** * 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;
que es añadido por Martin Buchholz (Google) el 2010-05-09 ; revisado por Chris Hegarty (Oracle).
Entonces, probablemente podemos decir que el número máximo "seguro" sería 2 147 483 639 ( Integer.MAX_VALUE - 8
) y "los intentos de asignar matrices más grandes pueden dar como resultado OutOfMemoryError ".
(Sí, la reclamación independiente de Buchholz no incluye evidencia de respaldo, por lo que esta es una apelación calculada a la autoridad. Incluso dentro de OpenJDK, podemos ver código como return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
que demuestra que MAX_ARRAY_SIZE
no Sin embargo, tienen un uso real .
Intenté crear una matriz de bytes como esta
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
Con esta configuración de ejecución:
-Xms4G -Xmx4G
Y la versión de Java:
Versión de Openjdk "1.8.0_141"
OpenJDK Runtime Environment (compilación 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (compilación 25.141-b16, modo mixto)
Solo funciona para x> = 2, lo que significa que el tamaño máximo de una matriz es Integer.MAX_VALUE-2
Valores superiores a los que dan.
Excepción en el subproceso "main" java.lang.OutOfMemoryError: El tamaño del arreglo solicitado excede el límite de VM en Main.main (Main.java:6)
Las matrices tienen un índice entero no negativo, por lo que el tamaño máximo de matriz al que se puede acceder sería Integer.MAX_VALUE
. La otra cosa es cuán grande matriz puedes crear. Depende de la memoria máxima disponible para su JVM
y del tipo de contenido de la matriz. Cada elemento del arreglo tiene su tamaño, ejemplo. byte = 1 byte
, int = 4 bytes
, Object reference = 4 bytes (on a 32 bit system)
Entonces, si tiene 1 MB
memoria disponible en su máquina, podría asignar una matriz de byte[1024 * 1024]
u Object[256 * 1024]
.
Respondiendo a su pregunta : puede asignar una matriz de tamaño (memoria disponible / tamaño máximo del elemento de matriz).
Resumen : en teoría, el tamaño máximo de una matriz será Integer.MAX_VALUE
. Prácticamente depende de la cantidad de memoria que tenga su JVM
y de la cantidad que ya se haya asignado a otros objetos.
No he visto la respuesta correcta, aunque es muy fácil de probar.
En una máquina virtual HotSpot reciente, la respuesta correcta es Integer.MAX_VALUE - 5
. Una vez que vas más allá de eso:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
Usted obtiene:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit