web-dev-qa-db-fra.com

Les baies Java ont-elles une taille maximale?

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

193
Lizard

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à:

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

Vous recevez:

Exception in thread "main" Java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit
165
Kevin Bourrillion

Ceci est (bien sûr) totalement dépendant de la VM.

Parcourant le code source d'OpenJDK 7 et 8 Java.util.ArrayList , .Hashtable , .AbstractCollection , .PriorityQueue _ et .Vector , vous pouvez voir cette réclamation se répéter:

/**
 * 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;

qui est ajouté par Martin Buchholz (Google) le 2010-05-09 ; révisé par Chris Hegarty (Oracle).

Ainsi, probablement, nous pouvons dire que le nombre "sûr" maximum serait 2 147 483 639 (Integer.MAX_VALUE - 8) et que "toute tentative d'allocation de tableaux plus grands peut entraîner OutOfMemoryError ".

(Oui, la réclamation autonome de Buchholz n'inclut pas de preuve à l'appui. Il s'agit donc d'un appel à l'autorité. } Même au sein d'OpenJDK, nous pouvons voir du code comme return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; qui montre que MAX_ARRAY_SIZE ne le fait pas. encore avoir une utilisation réelle.)

118
Pacerier

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

38
tvanfosson

En passant par cet article http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays :

Java a été critiqué pour ne pas prendre en charge des tableaux de plus de 231−1 (environ 2,1 milliards) d’éléments. Ceci est une limitation de la langue; La section 10.4 de la spécification du langage Java stipule que:

Les tableaux doivent être indexés par des valeurs int ... Une tentative d'accès à un tableau Le composant avec une valeur d'index longue génère une erreur lors de la compilation.

La prise en charge de baies de grande taille nécessiterait également des modifications de la machine virtuelle Java. Cette limitation se manifeste dans des domaines tels que les collections étant limitées à 2 milliards d'éléments et l'incapacité de mémoriser des fichiers cartographiques de plus de 2 Gio. Java manque également de véritables tableaux multidimensionnels (blocs de mémoire alloués de manière contiguës et accessibles par un seul indirection), ce qui limite les performances du calcul scientifique et technique.

25
working

Les tableaux étant un entier non négatif indexé, la taille maximale du tableau auquel vous pouvez accéder serait Integer.MAX_VALUE. L'autre chose est la taille du tableau que vous pouvez créer. Cela dépend de la mémoire maximale disponible pour votre JVM et du type de contenu du tableau. Chaque élément de tableau a sa taille, exemple. byte = 1 byte, int = 4 bytes, Object reference = 4 bytes (on a 32 bit system) 

Donc, si vous avez la mémoire 1 MB disponible sur votre ordinateur, vous pouvez allouer un tableau de byte[1024 * 1024] ou Object[256 * 1024]

Réponse à votre question - Vous pouvez allouer un tableau de taille (mémoire maximale disponible/taille de l'élément du tableau). 

Résumé - Théoriquement, la taille maximale d'un tableau sera de Integer.MAX_VALUE. En pratique, cela dépend de la quantité de mémoire dont dispose votre JVM et de la quantité de mémoire déjà allouée à d'autres objets.

10
Dhanuka

J'ai essayé de créer un tableau d'octets comme celui-ci

byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);

Avec cette configuration d'exécution:

-Xms4G -Xmx4G

Et la version Java:

Openjdk version "1.8.0_141" 

OpenJDK Runtime Environment (version 1.8.0_141-b16) 

Serveur OpenJDK 64 bits VM (version 25.141-b16, mode mixte)

Cela ne fonctionne que pour x> = 2, ce qui signifie que la taille maximale d'un tableau est Integer.MAX_VALUE-2

Les valeurs ci-dessus qui donnent

Exception dans le thread "principal" Java.lang.OutOfMemoryError: la taille du tableau demandé dépasse la limite VM. à Main.main (Main.Java:6)

3
Vasilis Nicolaou

Le nombre maximum d'éléments d'une array est (2^31)−1 ou 2 147 483 647 

1
Baby

En fait, c’est la limitation de Java qui le limite à 2 ^ 30-4, soit 1073741820. Pas à 2 ^ 31-1. Je ne sais pas pourquoi mais je l’ai testé manuellement sur jdk. 2 ^ 30-3 jetant toujours vm sauf

Edit: corrigé -1 à -4, vérifié sur windows jvm

0
Ferned