248 votes

Les tableaux Java ont-ils une taille maximale?

Y a-t-il une limite au nombre d'éléments qu'un tableau Java peut contenir? Si oui, qu'est-ce que c'est?

205voto

Kevin Bourrillion Points 19677

Je n'ai pas vu la bonne réponse, même si c'est très facile à tester.

Dans une machine virtuelle HotSpot récente, la réponse correcte est Integer.MAX_VALUE - 5 . Une fois que vous allez au-delà de cela:

 public class Foo {
  public static void main(String[] args) {
    Object[] array = new Object[Integer.MAX_VALUE - 4];
  }
}
 

Vous obtenez:

 Exception in thread "main" java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit
 

147voto

Pacerier Points 15960

Certaines machines virtuelles réservent des mots d’en-tête dans un tableau. Le nombre maximum "sûr" serait 2 147 483 639 ( Integer.MAX_VALUE - 8 ). Les tentatives d'allocation de tableaux plus volumineux peuvent provoquer java.lang.OutOfMemoryError.

Si vous avez le code source pour les classes java, checkout java.util.ArrayList .class (ligne 190):

   /**
     * The maximum size of array to allocate.
     * 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;
 

40voto

tvanfosson Points 268301

Il y a en fait deux limites. Un, l'élément maximal indexable pour le tableau et, deux, la quantité de mémoire disponible pour votre application. Selon la quantité de mémoire disponible et la quantité utilisée par les autres structures de données, vous pouvez atteindre la limite de mémoire avant d'atteindre l'élément de tableau adressable maximal.

32voto

RJadhav Points 198

En passant par cet article

http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays

Java a été critiqués pour ne pas soutenir des tableaux de plus de 2^31-1 (environ 2,1 milliards de dollars) éléments. C'est une limitation de la langue; la Java Langage de Spécification, à la Section 10.4, stipule que:

Les tableaux doivent être indexés par les valeurs int... Une tentative d'accès à un tableau composant avec une longue indice de valeur se traduit par une erreur de compilation.

L'appui de grands tableaux serait également nécessiter des changements à la JVM. Cette limitation se manifeste dans des domaines tels que les collections étant limité à 2 milliards de dollars des éléments et de l'impossibilité de carte mémoire les fichiers de plus de 2 GO. Java manque aussi de véritables tableaux multidimensionnels (de manière contiguë alloué de simples blocs de mémoire accessible par une simple indirection), ce qui limite la performance scientifique et technique de l'informatique.

2voto

TheQuickBrownFox Points 3763

Nombre maximum d'éléments d'un array est (2^31)−1 ou 2 147 483 647

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X