Ich denke, die Idee von Abstimmungen macht keinen Sinn, es sei denn, wir sind bereit, Antworten, die schlicht und einfach falsch sind, abzulehnen . Ist der Unterschied von fünf Bytes in der realen Welt tatsächlich wichtig, NEIN, natürlich nicht. Aber es geht mich an, dass die Leute bereit sind, eine Antwort "autoritativ" zu geben, ohne es zu versuchen, um zu sehen, ob es wirklich funktioniert. Was das Speicherlimit betrifft, so ist DUH. Das ist so, als hättest du mich gefragt: "Wie viele Trauben kannst du essen?" und ich sagte: "Nun, es hängt davon ab, wie viele ich gerade im Kühlschrank habe."
Kevin Bourrillion
7
Weißt du zufällig, warum es dir diese fünf Bytes nicht gibt? Ist dies notwendigerweise etwas, das immer in Java passiert, oder könnte es nur mit dem Speicher Ihres Computers zusammenhängen oder so?
Taymon
17
@ Kevin Bourrillion: Dies scheint sich geändert zu haben. Mit Oracle 1.7.0_07 kann ich MAX_VALUE-2Elemente zuordnen . Dies ist unabhängig von dem, was ich zuordne, und ich frage mich wirklich, wofür die VM die beiden "Dinge" verwenden kann (die Länge passt nicht in 2 Bytes).
Maaartinus
3
@ TomášZato spätestens um Integer.MAX_VALUE+1, Sie werden einen ganzzahligen Überlauf haben. Array-Größen in Java sind intnicht long; Unabhängig davon, welchen Datentyp Sie in Ihrem Array, Ihren Bytes oder Referenzen speichern. Zeichenfolgen sind nur Objektreferenzen.
Hat aufgehört - Anony-Mousse
8
Die maximale Anzahl von Elementen in einem Array in JDK 6 und höher beträgt Integer.MAX_VALUE - 2= 2 147 483 645. Java weist ein solches Array erfolgreich zu, wenn Sie es mit ausführen -Xmx13G. Es schlägt fehl, OutOfMemoryError: Java heap spacewenn Sie bestehen -Xmx12G.
/**
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/privatestaticfinalint MAX_ARRAY_SIZE =Integer.MAX_VALUE -8;
welches von Martin Buchholz (Google) am 09.05.2010 hinzugefügt wird ; rezensiert von Chris Hegarty (Oracle).
Daher können wir wahrscheinlich sagen, dass die maximale "sichere" Anzahl 2 147 483 639 ( Integer.MAX_VALUE - 8) beträgt und "Versuche, größere Arrays zuzuweisen, zu OutOfMemoryError führen können ".
@ Pacerier. Sollte diese MAX_ARRAY_SIZE nicht nur angewendet werden, wenn Sie eine ArrayList verwenden? Das unterscheidet sich von der Verwendung eines Arrays wie int [] array = new int [some_value_here]; ist es nicht? Warum kann eine in ArrayList definierte Konstante auf ein normales Array angewendet werden (definiert mit [])? Sind sie hinter den Kulissen gleich?
Tiago
1
@Tiago, Nein, der Code selbst hat nichts mit der maximalen Größe von Arrays zu tun. Es ist nur eine Behauptung.
Pacerier
@ JohnWinter, Das Zitat besagt "Einige VMs reservieren einige Header-Wörter in einem Array". Das -8liegt also an den Bytes, die die reservierten Header-Wörter belegen würden.
Pacerier
38
Es gibt tatsächlich zwei Grenzen. Erstens das maximale für das Array indizierbare Element und zweitens die für Ihre Anwendung verfügbare Speichermenge. Abhängig von der verfügbaren Speichermenge und der von anderen Datenstrukturen verwendeten Speichermenge können Sie die Speichergrenze erreichen, bevor Sie das maximal adressierbare Array-Element erreichen.
Java wurde dafür kritisiert, dass es keine Arrays mit mehr als 2 31 -1 (ungefähr 2,1 Milliarden) Elementen unterstützt. Dies ist eine Einschränkung der Sprache; In der Java-Sprachspezifikation, Abschnitt 10.4, heißt es:
Arrays müssen durch int-Werte indiziert werden ... Ein Versuch, auf eine Array-Komponente mit einem langen Indexwert zuzugreifen, 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 äußert sich in Bereichen wie der Beschränkung von Sammlungen auf 2 Milliarden Elemente und der Unfähigkeit, Speicherzuordnungsdateien mit mehr als 2 GiB zu speichern. Java fehlen auch echte mehrdimensionale Arrays (zusammenhängend zugewiesene einzelne Speicherblöcke, auf die durch eine einzelne Indirektion zugegriffen wird), was die Leistung für wissenschaftliches und technisches Rechnen einschränkt.
Java fehlt der syntaktische Zucker für mehrdimensionale Arrays, aber Sie können sie immer noch mit ein wenig Multiplikation "haben" (es sei denn, die Gesamtgröße des Arrays hat die oben genannte Grenze überschritten)
kbolino
11
Arrays sind nicht negativ ganzzahlig indiziert, sodass Sie maximal auf die Arraygröße zugreifen können Integer.MAX_VALUE. Die andere Sache ist, wie großes Array Sie erstellen können. Dies hängt vom maximal verfügbaren Speicher JVMund dem Inhaltstyp des Arrays ab. Jedes Array-Element hat beispielsweise seine Größe. byte = 1 byte, int = 4 bytes,Object reference = 4 bytes (on a 32 bit system)
Wenn 1 MBauf Ihrem Computer also Speicher verfügbar ist, können Sie ein Array von byte[1024 * 1024]oder zuweisen Object[256 * 1024].
Beantwortung Ihrer Frage - Sie können ein Array mit einer Größe zuweisen (maximal verfügbarer Speicher / Größe des Array-Elements).
Zusammenfassung - Theoretisch ist die maximale Größe eines Arrays Integer.MAX_VALUE. Praktisch hängt es davon ab, wie viel Speicher Sie JVMhaben und wie viel davon bereits anderen Objekten zugewiesen wurde.
Ja, das Java-Array ist begrenzt. Java verwendet eine Ganzzahl als Index für das Array und der maximale Ganzzahlspeicher von JVM beträgt 2 ^ 32. Sie können also 2.147.483.647 Elemente im Array speichern.
Wenn Sie mehr als die maximale Länge benötigen, können Sie zwei verschiedene Arrays verwenden. Die empfohlene Methode besteht jedoch darin, Daten in einer Datei zu speichern. weil das Speichern von Daten in der Datei keine Begrenzung hat. weil Dateien, die in Ihren Speichertreibern, aber im Array gespeichert sind, in JVM gespeichert sind. JVM bietet begrenzten Speicherplatz für die Programmausführung.
Java kann kein Array mit einer Größe zuweisen Integer.MAX_VALUE - 1. Sie erhalten "java.lang.OutOfMemoryError: Angeforderte Arraygröße überschreitet VM-Grenze". Die maximale Anzahl von Elementen in JDK 6 und höher ist Integer.MAX_VALUE - 2= 2 147 483 645.
Alexey Ivanov
0
Tatsächlich ist es eine Java-Beschränkung, die es auf 2 ^ 30-4 begrenzt und 1073741820 ist. Nicht 2 ^ 31-1. Keine Ahnung warum, aber ich habe es manuell auf JDK getestet. 2 ^ 30-3 wirft immer noch vm außer
Bearbeiten: -1 bis -4 behoben, unter Windows JVM aktiviert
Sie verwenden eine 32-Bit-JVM. Verwenden Sie eine 64-Bit-JVM, und die JVM-Grenze liegt nahe bei 2 ^ 31. (Sie benötigen auch Heap-Speicherplatz, was nicht die Standardeinstellung ist und von Ihrem physischen Speicher beeinflusst wird.)
Antworten:
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:Du erhältst:
quelle
MAX_VALUE-2
Elemente zuordnen . Dies ist unabhängig von dem, was ich zuordne, und ich frage mich wirklich, wofür die VM die beiden "Dinge" verwenden kann (die Länge passt nicht in 2 Bytes).Integer.MAX_VALUE+1
, Sie werden einen ganzzahligen Überlauf haben. Array-Größen in Java sindint
nichtlong
; Unabhängig davon, welchen Datentyp Sie in Ihrem Array, Ihren Bytes oder Referenzen speichern. Zeichenfolgen sind nur Objektreferenzen.Integer.MAX_VALUE - 2
= 2 147 483 645. Java weist ein solches Array erfolgreich zu, wenn Sie es mit ausführen-Xmx13G
. Es schlägt fehl,OutOfMemoryError: Java heap space
wenn Sie bestehen-Xmx12G
.Dies ist (natürlich) vollständig VM-abhängig.
Browsing durch den Quellcode von OpenJDK 7 und 8
java.util.ArrayList
,.Hashtable
,.AbstractCollection
,.PriorityQueue
, und.Vector
können Sie sehen , diese Forderung wiederholt werden:welches von Martin Buchholz (Google) am 09.05.2010 hinzugefügt wird ; rezensiert von Chris Hegarty (Oracle).
Daher können wir wahrscheinlich sagen, dass die maximale "sichere" Anzahl 2 147 483 639 (
Integer.MAX_VALUE - 8
) beträgt und "Versuche, größere Arrays zuzuweisen, zu OutOfMemoryError führen können ".(Ja, Buchholz 'eigenständige Behauptung enthält keine Belege, daher handelt es sich um einen kalkulierten Aufruf an die Behörde. Selbst innerhalb von OpenJDK selbst können wir Code sehen,
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
der zeigt, dass erMAX_ARRAY_SIZE
noch keinen wirklichen Nutzen hat.)quelle
-8
?-8
liegt also an den Bytes, die die reservierten Header-Wörter belegen würden.Es gibt tatsächlich zwei Grenzen. Erstens das maximale für das Array indizierbare Element und zweitens die für Ihre Anwendung verfügbare Speichermenge. Abhängig von der verfügbaren Speichermenge und der von anderen Datenstrukturen verwendeten Speichermenge können Sie die Speichergrenze erreichen, bevor Sie das maximal adressierbare Array-Element erreichen.
quelle
Gehen Sie diesen Artikel durch http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays :
Die Unterstützung großer Arrays würde auch Änderungen an der JVM erfordern. Diese Einschränkung äußert sich in Bereichen wie der Beschränkung von Sammlungen auf 2 Milliarden Elemente und der Unfähigkeit, Speicherzuordnungsdateien mit mehr als 2 GiB zu speichern. Java fehlen auch echte mehrdimensionale Arrays (zusammenhängend zugewiesene einzelne Speicherblöcke, auf die durch eine einzelne Indirektion zugegriffen wird), was die Leistung für wissenschaftliches und technisches Rechnen einschränkt.
quelle
Arrays sind nicht negativ ganzzahlig indiziert, sodass Sie maximal auf die Arraygröße zugreifen können
Integer.MAX_VALUE
. Die andere Sache ist, wie großes Array Sie erstellen können. Dies hängt vom maximal verfügbaren SpeicherJVM
und dem Inhaltstyp des Arrays ab. Jedes Array-Element hat beispielsweise seine Größe.byte = 1 byte
,int = 4 bytes
,Object reference = 4 bytes (on a 32 bit system)
Wenn
1 MB
auf Ihrem Computer also Speicher verfügbar ist, können Sie ein Array vonbyte[1024 * 1024]
oder zuweisenObject[256 * 1024]
.Beantwortung Ihrer Frage - Sie können ein Array mit einer Größe zuweisen (maximal verfügbarer Speicher / Größe des Array-Elements).
Zusammenfassung - Theoretisch ist die maximale Größe eines Arrays
Integer.MAX_VALUE
. Praktisch hängt es davon ab, wie viel Speicher SieJVM
haben und wie viel davon bereits anderen Objekten zugewiesen wurde.quelle
Ich habe versucht, ein solches Byte-Array zu erstellen
Mit dieser Laufkonfiguration:
Und Java-Version:
Es funktioniert nur für x> = 2, was bedeutet, dass die maximale Größe eines Arrays Integer.MAX_VALUE-2 ist
Werte darüber geben
quelle
Ja, das Java-Array ist begrenzt. Java verwendet eine Ganzzahl als Index für das Array und der maximale Ganzzahlspeicher von JVM beträgt 2 ^ 32. Sie können also 2.147.483.647 Elemente im Array speichern.
Wenn Sie mehr als die maximale Länge benötigen, können Sie zwei verschiedene Arrays verwenden. Die empfohlene Methode besteht jedoch darin, Daten in einer Datei zu speichern. weil das Speichern von Daten in der Datei keine Begrenzung hat. weil Dateien, die in Ihren Speichertreibern, aber im Array gespeichert sind, in JVM gespeichert sind. JVM bietet begrenzten Speicherplatz für die Programmausführung.
quelle
Maximale Anzahl von Elementen eines
array
ist(2^31)−1
oder2 147 483 647
quelle
Integer.MAX_VALUE - 1
. Sie erhalten "java.lang.OutOfMemoryError: Angeforderte Arraygröße überschreitet VM-Grenze". Die maximale Anzahl von Elementen in JDK 6 und höher istInteger.MAX_VALUE - 2
= 2 147 483 645.Tatsächlich ist es eine Java-Beschränkung, die es auf 2 ^ 30-4 begrenzt und 1073741820 ist. Nicht 2 ^ 31-1. Keine Ahnung warum, aber ich habe es manuell auf JDK getestet. 2 ^ 30-3 wirft immer noch vm außer
Bearbeiten: -1 bis -4 behoben, unter Windows JVM aktiviert
quelle