Long und Frage zum Speicherplatz eines Arrays

glitsch

Aktives Mitglied
Hi zusammen,
ich muss feststellen, wie viel Bytes ein Array mit Long-Werten gefüllt ausmacht. Mein Array ist vom Typ long und gefüllt mit je 10 Werten die dreistellig sind: {500,501,502 etc.}. Wie sieht meine Rechnung aus? Kann mir jemand kurz die Rechnung erklären.

Danke für die Hilfe!🙂
 
Jop, wären dann genau 8 Byte * 10 = 80 Byte. Die Länge der Werte spielt ja absolut keine Rolle, einzig der Datentyp ist das, was zählt.

boolean - 1 Bit
byte - 1 Byte
char - 2 Byte
short - 2 Byte
int - 4 Byte
long - 8 Byte
float - 4 Byte
double - 8 Byte

Tatsächlich wird aber in Java ein int für alle Datentypen, von den größeren ausgenommen, reserviert.
 
Zuletzt bearbeitet:
Außerdem werden doch noch 4 Byte für den "Pointer" auf das Array verwendet, oder nicht?
Jein. Das Array selbst speichert noch ein paar Metainformationen, etwa die Länge des Arrays, und außerdem kommt da noch der "Header" hinzu, den jedes andere Objekt auch hat.

Die Bytes zur Referenzierung des Arrays (also die Referenz) kostet auch noch mal Speicher, vielleicht 4 oder 8 Bytes (gerade keine Ahnung, ob das z.B. davon abhängt, ob das in einer 32-Bit-JVM oder einer 64-Bit-JVM läuft). Aber diese Referenzen werden dort gespeichert, wo eben die Referenzen liegen (d.h., für lokale Variablen auf dem Stack, für Felder eines Objektes an einer entsprechenden Position auf dem Heap). Dafür kann das Array selbst nichts.

Ark
 
Tatsächlich wird aber in Java ein int für alle Datentypen, von den größeren ausgenommen, reserviert.

Für die Daten auf dem Stack stimmt das so, aber innerhalb von Objekten wird meistens nur der Platz belegt der für den Datentypen notwendig ist. Durch das Alignment der Werte innerhalb der Objekte kann es aber durchaus so vorkommen. Außerdem belegen Objekte immer ein vielfaches von 8 Bytes.

Jein. Das Array selbst speichert noch ein paar Metainformationen, etwa die Länge des Arrays, und außerdem kommt da noch der "Header" hinzu, den jedes andere Objekt auch hat.

Der Header besteht aus einer Referenz auf den Typen (je nach System und VM-Einstellung 4 oder 8 Bytes) und 4 Bytes für den identityHashCode. Bei Arrays kommt dazu nur noch die Länge von 4 Bytes dazu.
 
10*8 Bytes + 4 Bytes Länge/Pointer aufs Array = 84 Bytes deckt sich mit meiner Lösung. Jetzt hab ich kapiert, wieso 84 Bytes. :applaus:
 
10*8 Bytes + 4 Bytes Länge/Pointer aufs Array = 84 Bytes deckt sich mit meiner Lösung.
Na ja, "Länge" und "Pointer" sind mal zwei völlig verschiedene Sachen. Wahrscheinlich geht's um den "Netto"-Speicherverbrauch, also die reine "Nutzlast" des Arrays, und das sind eben nur die Länge des Arrays (4 Bytes) plus Größe von long (8 Bytes) mal Länge des Arrays (10): 4 Bytes + 8 Bytes * 0 = 84 Bytes.

Soll heißen: Referenzen auf das Array sollte man nicht mitzählen. (Der Overhead spielt erst ab einer gewissen Anzahl der Referenzen und/oder Objekte eine Rolle.)

Ark
 

Zurück
Oben