webentwicklung-frage-antwort-db.com.de

Haben Java-Arrays eine maximale Größe?

Gibt es eine Begrenzung für die Anzahl der Elemente, die ein Java-Array enthalten kann? Wenn ja, was ist das?

193
Lizard

Ich habe nicht die richtige Antwort gesehen, obwohl es sehr einfach zu testen ist.

In einer aktuellen HotSpot-VM lautet die richtige Antwort Integer.MAX_VALUE - 5. Sobald Sie darüber hinausgehen:

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

Du kriegst:

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

Dies ist natürlich völlig VM-abhängig.

Durchsuchen des Quellcodes von OpenJDK 7 und 8 Java.util.ArrayList , .Hashtable , .AbstractCollection , .PriorityQueue und .Vector , Sie können sehen, dass sich claim wiederholt:

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

die von Martin Buchholz (Google) am 2010-05-09 hinzugefügt wird; rezensiert von Chris Hegarty (Oracle).

Wahrscheinlich können wir also sagen, dass die maximale "sichere" Zahl 2 147 483 639 (Integer.MAX_VALUE - 8) wäre und "Versuche, größere Arrays zuzuordnen, zu OutOfMemoryError " führen können.

(Ja, die eigenständige Behauptung von Buchholz enthält keine Beweismittel, so dass dies ein berechnetes appellieren an die Behörde. Ist. Selbst innerhalb von OpenJDK selbst können wir Code wie return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; sehen, der zeigt, dass MAX_ARRAY_SIZE dies nicht tut noch ein real verwenden.)

118
Pacerier

Es gibt eigentlich zwei Grenzen. Zum einen das maximal indizierbare Element für das Array und zum anderen der für Ihre Anwendung verfügbare Speicherplatz. Abhängig von der Menge des verfügbaren Speichers und der von anderen Datenstrukturen verwendeten Menge können Sie die Speichergrenze erreichen, bevor Sie das maximal adressierbare Arrayelement erreichen.

38
tvanfosson

Gehen Sie durch diesen Artikel http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays :

Java wurde kritisiert, weil es keine Arrays von mehr als 2 unterstützt31-1 (etwa 2,1 Milliarden) Elemente. Dies ist eine Einschränkung der Sprache. Die Java-Sprachspezifikation, Abschnitt 10.4, besagt Folgendes:

Arrays müssen mit int-Werten indiziert werden ... Ein Versuch, auf ein Array zuzugreifen Eine Komponente mit einem langen Indexwert führt zu einem Fehler bei der Kompilierung.

Die Unterstützung großer Arrays würde auch Änderungen an der JVM erfordern. Diese Einschränkung manifestiert sich in Bereichen wie Sammlungen, die auf 2 Milliarden Elemente beschränkt sind, und die Unfähigkeit, Speicherabbildungsdateien zu speichern, die größer als 2 GiB sind. Java verfügt auch nicht über echte mehrdimensionale Arrays (zusammenhängend zugewiesene einzelne Speicherblöcke, auf die durch eine einzige Umleitung zugegriffen wird), wodurch die Leistung für das wissenschaftliche und technische Rechnen eingeschränkt wird.

25
working

Arrays sind nicht negative Ganzzahlen, die indiziert sind. Die maximale Arraygröße, auf die Sie zugreifen können, wäre Integer.MAX_VALUE. Die andere Sache ist, wie groß das Array ist, das Sie erstellen können. Dies hängt von dem für JVM maximal verfügbaren Speicher und dem Inhaltstyp des Arrays ab. Jedes Array-Element hat seine Größe, Beispiel. byte = 1 byte, int = 4 bytes, Object reference = 4 bytes (on a 32 bit system) 

Wenn also 1 MB Speicher auf Ihrem Computer verfügbar ist, können Sie ein Array mit byte[1024 * 1024] oder Object[256 * 1024] zuweisen. 

Beantworten Ihrer Frage - Sie können ein Array mit Größe zuweisen (maximal verfügbarer Speicher/Größe des Arrayelements). 

Zusammenfassung - Theoretisch ist die maximale Größe eines Arrays Integer.MAX_VALUE. Praktisch hängt es davon ab, wie viel Speicher Ihr JVM hat und wie viel davon bereits anderen Objekten zugewiesen wurde.

10
Dhanuka

Ich habe versucht, ein derartiges Byte-Array zu erstellen

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

Mit dieser Laufkonfiguration:

-Xms4G -Xmx4G

Und Java-Version:

Openjdk Version "1.8.0_141" 

OpenJDK-Laufzeitumgebung (Build 1.8.0_141-b16) 

64-Bit-Server von OpenJDK VM (Build 25.141-b16, gemischter Modus)

Dies funktioniert nur für x> = 2, dh die maximale Größe eines Arrays ist Integer.MAX_VALUE-2

Werte darüber geben

Ausnahme im Thread "main" Java.lang.OutOfMemoryError: Die Größe des angeforderten Arrays überschreitet den Grenzwert VM am Main.main (Main.Java:6)

3

Die maximale Anzahl von Elementen einer array ist (2^31)−1 oder 2 147 483 647 

1
Baby

Eigentlich ist es die Java-Einschränkung, die es bei 2 ^ 30-4 auf 1073741820 begrenzt. Ich weiß nicht warum, aber ich habe es manuell auf jdk getestet. 2 ^ 30-3 wirft noch vm außer

Edit: fixiert von -1 bis -4, unter Windows jvm geprüft

0
Ferned